it-swarm.com.de

Laravel 5.5 ajax call 419 (unbekannter Status)

Ich mache einen Ajax-Anruf, erhalte jedoch diese Fehlermeldung:

419 (unbekannter Status)

Keine Ahnung, was das verursacht, was ich in anderen Beiträgen gesehen habe, es hat etwas mit csrf-Token zu tun, aber ich habe kein Formular, daher weiß ich nicht, wie ich das beheben soll.

mein Anruf:

$('.company-selector li > a').click(function(e) {
     e.preventDefault();

     var companyId = $(this).data("company-id");


      $.ajax({
          headers: {
          'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          },
          url: '/fetch-company/' + companyId,
          dataType : 'json',
          type: 'POST',
          data: {},
          contentType: false,
          processData: false,
          success:function(response) {
               console.log(response);
          }
     });
  });

Meine Route:

Route::post('fetch-company/{companyId}', '[email protected]');

Meine Controller-Methode

/**
 * Fetches a company
 *
 * @param $companyId
 *
 * @return array
 */
public function fetchCompany($companyId)
{
    $company = Company::where('id', $companyId)->first();

    return response()->json($company);
}

Das Endziel besteht darin, etwas aus der Antwort in einem HTML-Element anzuzeigen.

83
Chris

Verwenden Sie dies im Kopfbereich: 

<meta name="csrf-token" content="{{ csrf_token() }}">

und erhalte den csrf token in ajax:

$.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  }
});

Weitere Informationen finden Sie in der Laravel-Dokumentation csrf_token

183
Kannan K

Eine andere Möglichkeit, dies zu beheben, besteht darin, das Feld _token in ajax-Daten zu verwenden und den Wert von {{csrf_token()}} in Blade festzulegen. Hier ist ein Arbeitscode, den ich gerade an meinem Ende ausprobiert habe.

$.ajax({
    type: "POST",
    url: '/your_url',
    data: { somefield: "Some field value", _token: '{{csrf_token()}}' },
    success: function (data) {
       console.log(data);
    },
    error: function (data, textStatus, errorThrown) {
        console.log(data);

    },
});
17
Waqas Bukhary

Dies ist ähnlich wie Kannans Antwort. Dies behebt jedoch ein Problem, bei dem das Token nicht an domänenübergreifende Sites gesendet werden sollte. Dadurch wird der Header nur festgelegt, wenn es sich um eine lokale Anforderung handelt.

HTML:

<meta name="csrf-token" content="{{ csrf_token() }}">

JS:

$.ajaxSetup({
    beforeSend: function(xhr, type) {
        if (!type.crossDomain) {
            xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
        }
    },
});
8

Möglicherweise stimmt Ihre Sitzungsdomäne nicht mit Ihrer App-URL und/oder dem Host überein, der für den Zugriff auf die Anwendung verwendet wird.

1.) Überprüfen Sie Ihre .env-Datei:

SESSION_DOMAIN=example.com
APP_URL=example.com

2.) Check config/session.php

Überprüfen Sie die Werte, um sicherzustellen, dass sie korrekt sind.

6
Jeff Callahan

verwenden Sie dies in Ihrer Seite

<meta name="csrf-token" content="{{ csrf_token() }}">

und in Ihrem Ajax verwendet es in Daten:

_token: '{!! csrf_token() !!}',

das ist:

$.ajax({
          url: '/fetch-company/' + companyId,
          dataType : 'json',
          type: 'POST',
          data: {
                   _token: '{!! csrf_token() !!}',
                 },
          contentType: false,
          processData: false,
          success:function(response) {
               console.log(response);
          }
     });

Vielen Dank.

5

in meinem Fall habe ich vergessen, die Eingabe von csrf_token zum übergebenen Formular hinzuzufügen

<form class="form-material" id="myform">
...
<input type="file" name="l_img" id="l_img">
<input type="hidden" id="_token" value="{{ csrf_token() }}">
..
</form>

JS:

//setting containers
        var _token = $('input#_token').val();
        var l_img = $('input#l_img').val();
        var formData = new FormData();
        formData.append("_token", _token);
        formData.append("l_img", $('#l_img')[0].files[0]);

        if(!l_img) {
            //do error if no image uploaded
            return false;
        }
        else
        {
            $.ajax({
                type: "POST",
                url: "/my_url",
                contentType: false,
                processData: false,
                dataType: "json",
                data : formData,
                beforeSend: function()
                {
                    //do before send
                },
                success: function(data)
                {
                    //do success
                },
                error: function(jqXhr, textStatus, errorThrown) //jqXHR, textStatus, errorThrown
                {
                    if( jqXhr.status === "422" ) {
                        //do error
                    } else {
                        //do error
                    }
                }
            });
        }
        return false; //not to post the form physically
4
The Dead Guy

Wenn Sie .js aus einer Datei laden, müssen Sie eine Variable mit dem csrf_token in Ihrer "main" .blade.php-Datei festlegen, in die Sie die .js importieren, und die Variable in Ihrem Ajax-Aufruf verwenden.

index.blade.php

...
...
<script src="{{ asset('js/anotherfile.js') }}"></script>
<script type="text/javascript">
        var token = '{{ csrf_token() }}';
</script>

eine andere Datei.js

$.ajax({
    url: 'yourUrl',
    type: 'POST',
    data: {
        '_token': token
    },
    dataType: "json",
    beforeSend:function(){
        //do stuff
    },
    success: function(data) {
        //do stuff
    },
    error: function(data) {
        //do stuff
    },
    complete: function(){
        //do stuff
    }
});
2
Wolfernand

Wenn Sie die obigen Vorschläge bereits gemacht haben und immer noch das Problem haben. 

Stellen Sie sicher, dass die Umgebungsvariable: 

SESSION_SECURE_COOKIE

Ist auf falsegesetzt, wenn Sie kein SSL-Zertifikat haben, wie beim lokalen Zertifikat. 

2
2Fwebd

Auch wenn Sie einen csrf_token haben, können Sie, wenn Sie Ihre Controller-Aktionen mit Laravel Policies authentifizieren, auch eine Antwort von 419 erhalten. In diesem Fall sollten Sie die erforderlichen Richtlinienfunktionen in Ihre Policy-Klasse einfügen.

2
Tharanga

Sie müssen das CSRF-Token erhalten.

$.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  }
});

Nachdem Sie dasselbe Problem gemacht haben, fügen Sie einfach dieses Meta-Tag hinzu: < meta name="csrf-token" content="{{ csrf_token() }}" >

Nachdem auch der Fehler aufgetreten ist, können Sie den Ajax-Fehler überprüfen. Dann überprüfen Sie auch den Ajax-Fehler 

$.ajax({
    url: 'some_unknown_page.html',
    success: function (response) {
        $('#post').html(response.responseText);
    },
    error: function (jqXHR, exception) {
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    },
});
1

serialisieren Sie einfach die Formulardaten und lösen Sie Ihr Problem.

data: $('#form_id').serialize(),
1
Muhammad Umair

einige refs =>

...
<head>
    // CSRF for all ajax call
    <meta name="csrf-token" content="{{ csrf_token() }}" />
</head>
 ...
 ...
<script>
    // CSRF for all ajax call
    $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': jQuery('meta[name="csrf-token"]').attr('content') } });
</script>
...
1
WHY

Dies funktioniert hervorragend für Fälle, in denen Sie kein Formular benötigen.

$.ajaxSetup({
        headers: {
        'X-CSRF-TOKEN': '<?php echo csrf_token() ?>'
        }
    });
0
lomelisan

Ich habe diesen Fehler erhalten, obwohl ich bereits ein CSRF-Token gesendet habe. Es stellte sich heraus, dass auf dem Server kein Platz mehr vorhanden war.

0
NicholasTes

Dieser Fehler tritt auch auf, wenn Sie vergessen haben, dies in Ihre Ajax-Übergabeanforderung (POST), ContentType: false, ProcessData: false, aufzunehmen.

0

Eine einfache Möglichkeit, einen unbekannten Status auf Ihrer Konsole zu beheben, besteht darin, dieses Skript in Ihr FORMULAR einzufügen. {{csrf_field ()}}

0
Denz A Gatcho

2019 Laravel Update, Ich hätte nie gedacht, dass ich dies veröffentlichen werde, aber für Entwickler wie mich, die die Browser-Abruf-API auf Laravel 5.8 und höher verwenden. Sie müssen Ihr Token über den Header-Parameter übergeben.

var _token = "{{ csrf_token }}";
fetch("{{url('add/new/comment')}}", {
                method: 'POST',
                headers: {
                    'X-CSRF-TOKEN': _token,
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify(name, email, message, article_id)
            }).then(r => {
                return r.json();
            }).then(results => {}).catch(err => console.log(err));
0
Delino
formData = new FormData();
formData.append('_token', "{{csrf_token()}}");
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);
0
learnkevin