2017-09-28 90 views
19

zrobić wywołanie ajax ale wciąż otrzymuję ten błąd:laravel 5,5 ajax wywołanie 419 (nieznany status)

419 (unknown status)

ma pojęcia, co jest przyczyną tego widziałem na innych stanowiskach, że musi coś zrobić z CSRF tokena ale nie mam formy, więc nie wiem, jak to naprawić.

moje wezwanie:

$('.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); 
      } 
    }); 
    }); 

Moja trasa:

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

Moja metoda kontroler

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

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

Ostatecznym celem jest, aby wyświetlić coś z odpowiedzią w elemencie html.

+2

czy to masz?' ' –

+0

@HanlinWang Nie Nie mam formularza, to tylko lista rozwijana. – Chris

+0

czy w formularzu dodano '{{csrf_field()}}'? –

Odpowiedz

37

Użyj tego w sekcji head:

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

i otrzymać token CSRF w Ajax:

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

Dzięki, to zadziałało. Próbowałem użyć metody "DELETE" dla wywołania ajax, a to zadziałało jak urok. – Salvo

+1

Mam dokładnie skonfigurowany kod, ale nadal mam problem z OP w następującej sytuacji: użytkownik jest zalogowany, ale strona pozostaje bezczynna przez dłuższy czas (na przykład komputer przechodzi w stan uśpienia z otwartą przeglądarką). W takim przypadku, gdy użytkownik wraca do komputera i próbuje wywołać AJAX, ten błąd się pojawia. Po ponownym załadowaniu wszystko wróci do normy. Czy ktoś ma na to rozwiązanie? – jovan

2

ta jest podobna do odpowiedzi Kannan użytkownika. Rozwiązuje to jednak problem polegający na tym, że token nie powinien być wysyłany do witryn międzydomenowych. Ustawi to tylko nagłówek, jeśli jest to żądanie lokalne.

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')); 
     } 
    }, 
}); 
-1

w moim przypadku zapomniałem dodać wejście csrf_token złożonego formularza. więc zrobiłem to HTML:

<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 
0

Nawet jeśli masz csrf_token, jeśli jesteś uwierzytelnić swoje działania kontrolera używając laravel Policies można mieć 419 odpowiedzi, jak również. W takim przypadku należy dodać niezbędne funkcje polityki w klasie Policy.

5

Innym sposobem rozwiązania tego problemu jest użycie pola _token w danych ajax i ustawienie w nim wartości {{csrf_token()}}. Oto działający kod, który właśnie wypróbowałem na moim końcu.

$.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); 

    }, 
}); 
0

Jeśli wykonałeś powyższe sugestie i nadal masz problem.

upewnić, że zmienną env:

SESSION_SECURE_COOKIE 

jest ustawiony na falsejeśli nie posiada certyfikatu SSL, jak na lokalne.