Laravel 5.5 ajax call 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}', '[email protected]');
Мой метод контроллера
/**
* Fetches a company
*
* @param $companyId
*
* @return array
*/
public function fetchCompany($companyId)
{
$company = Company::where('id', $companyId)->first();
return response()->json($company);
}
Конечная цель - отобразить что-то из ответа в элементе html.
Ответы
Ответ 1
Используйте это в разделе заголовка:
<meta name="csrf-token" content="{{ csrf_token() }}">
и получите токен csrf в ajax:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
Пожалуйста, обратитесь к документации Laravel csrf_token
Ответ 2
Другой способ разрешить это - использовать поле _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);
},
});
Ответ 3
Это похоже на ответ Кэннана. Тем не менее, это устраняет проблему, когда токен не следует отправлять на междоменные сайты. Это будет указывать только заголовок, если он является локальным запросом.
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'));
}
},
});
Ответ 4
Возможно, ваш домен сеанса не соответствует URL вашего приложения и/или хосту, используемому для доступа к приложению.
1.) Проверьте ваш файл .env:
SESSION_DOMAIN=example.com
APP_URL=example.com
2.) Проверьте config/session.php
Проверьте значения, чтобы убедиться, что они верны.
Ответ 5
используйте это на своей странице
<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);
}
});
Благодарю.
Ответ 6
в моем случае я забыл добавить вход 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
Ответ 7
Если вы уже сделали вышеупомянутые предложения и все еще имеете проблему.
Убедитесь, что переменная env:
SESSION_SECURE_COOKIE
Устанавливается в false
если у вас нет сертификата SSL, как на локальном.
Ответ 8
Даже если у вас есть csrf_token
, если вы проверяете действия своего контроллера с помощью Laravel Policies
, вы можете получить ответ 419. В этом случае вы должны добавить необходимые функции политики в свой класс Policy
.
Ответ 9
Если вы загружаете .js из файла, вы должны установить переменную с помощью csrf_token в вашем "основном" файле .blade.php, куда вы импортируете .js, и использовать переменную в вашем вызове ajax.
index.blade.php
...
...
<script src="{{ asset('js/anotherfile.js') }}"></script>
<script type="text/javascript">
var token = '{{ csrf_token() }}';
</script>
anotherfile.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
}
});
Ответ 10
некоторые ссылки =>
...
<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>
...
Ответ 11
просто сериализовать данные формы и решить вашу проблему.
data: $('#form_id').serialize(),
Ответ 12
Вы должны получить токен 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);
},
});
Ответ 13
Эта ошибка также происходит, если вы забыли включить это в запрос на отправку ajax (POST), contentType: false, processData: false,
Ответ 14
Это прекрасно работает в тех случаях, когда вам не нужна форма.
используйте это в заголовке:
<meta name="csrf-token" content="{{ csrf_token() }}">
и это в вашем коде JavaScript:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '<?php echo csrf_token() ?>'
}
});
Ответ 15
formData = new FormData();
formData.append('_token', "{{csrf_token()}}");
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);
Ответ 16
Получил эту ошибку, хотя я уже отправлял токен csrf. Оказалось, что на сервере больше не осталось места.
Ответ 17
Простой способ исправить неизвестный статус 419 на вашей консоли - поместить этот скрипт внутрь вашей FORM. {{csrf_field()}}
Ответ 18
Единственное решение, которое сработало для меня, это Laravel, исключающий URI из CSRF Protection
Мне пришлось жестко кодировать весь URL, не мог использовать константы для доменов. то есть. производство и разработка.
Ответ 19
2019 Обновление Laravel, Никогда не думал, что я опубликую это, но для тех разработчиков, как я, использующих API выборки браузера на Laravel 5.8 и выше Вы должны передать свой токен через параметр headers.
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));
Ответ 20
Это сработало для меня:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
}
});
После этого установите обычный вызов AJAX. Пример:
$.ajax({
type:'POST',
url:'custom_url',
data:{name: "some name", password: "pass", email: "[email protected]"},
success:function(response){
// Log response
console.log(response);
}
});