Laravel 5.5 ajax вызов 419 (неизвестный статус)
Я делаю вызов ajax, но я продолжаю получать эту ошибку:
419 (неизвестный статус)
не знаю, что вызывает это я видел на других постах он должен сделать что-то с CSRF токен, но у меня нет формы, поэтому я не знаю, как это исправить.
мой призыв:
$('.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);
}
});
});
маршрут:
Route::post('fetch-company/{companyId}', 'HomeController@fetchCompany');
мой метод контроллера
/**
* Fetches a company
*
* @param $companyId
*
* @return array
*/
public function fetchCompany($companyId)
{
$company = Company::where('id', $companyId)->first();
return response()->json($company);
}
конечная цель состоит в том, чтобы отобразить что-то из ответа в html элемент.
12 ответов:
используйте это в разделе head:
<meta name="csrf-token" content="{{ csrf_token() }}">и получить маркер csrf в ajax:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });пожалуйста, обратитесь к документации Laravel csrf_token
другой способ решить эту проблему-использовать
_tokenполе в ajax данных и установить значение{{csrf_token()}}в лезвие. Вот рабочий код, который я только что попробовал на моем конце.$.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); }, });
это похоже на ответ Каннана. Однако это устраняет проблему, когда маркер не следует отправлять на междоменные сайты. Это будет только установить заголовок, если это локальный запрос.
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')); } }, });
в моем случае я забыл добавить csrf_token вход в представленную форму. так что я сделал это 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
используйте это на своей странице
<meta name="csrf-token" content="{{ csrf_token() }}">и в вашем ajax использовал его в данных:
_token: '{!! csrf_token() !!}',что есть:
$.ajax({ url: '/fetch-company/' + companyId, dataType : 'json', type: 'POST', data: { _token: '{!! csrf_token() !!}', }, contentType: false, processData: false, success:function(response) { console.log(response); } });спасибо.
возможно, ваш домен сеанса не соответствует URL-адресу вашего приложения и / или хосту, используемому для доступа к приложению.
1.) Проверьте ваш .env file:
SESSION_DOMAIN=example.com APP_URL=example.com2.) Проверьте конфигурацию/сеанс.php
Проверьте значения, чтобы убедиться, что они верны.
даже если у вас есть
csrf_token, Если вы не проверить подлинность ваших действий регулятора, используя фреймворк LaravelPoliciesвы можете иметь 419 ответ. В этом случае вы должны добавить необходимые функции политики в свойPolicyкласса.
Если вы уже сделали вышеуказанные предложения и все еще имеете проблему.
убедитесь, что переменная env:
SESSION_SECURE_COOKIEустановлено значение
falseесли у вас нет SSL-сертификата, как на локальном.
при загрузке .js из файла вы должны установить переменную с csrf_token в вашем" main".лезвие.php-файл, в который вы импортируете .js и использовать переменную в вызове ajax.
.лезвие.php... ... <script src="{{ asset('js/anotherfile.js') }}"></script> <script type="text/javascript"> var token = '{{ csrf_token() }}'; </script>другой файл.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 } });
некоторые рефы =>
... <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> ...
вы должны получить маркер csrf..
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });после того, как вы сделаете ту же проблему ,просто добавьте этот мета-тег
< meta name="csrf-token" content="{{ csrf_token() }}" >после этого также возникает ошибка, вы можете проверить ошибку Ajax. Затем также проверьте ошибку Ajax
$.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); }, });
Comments