php - with - simple ajax post laravel
Laravel 5.5 ajax call 419(status desconhecido) (12)
Eu faço uma chamada de ajax mas continuo recebendo este erro:
419 (status desconhecido)
Não faço ideia do que está causando isso eu vi em outros posts que tem que fazer alguma coisa com o token csrf mas não tenho forma então não sei como consertar isso.
minha chamada:
$('.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);
}
});
});
Minha rota:
Route::post('fetch-company/{companyId}', '[email protected]');
Meu método controlador
/**
* Fetches a company
*
* @param $companyId
*
* @return array
*/
public function fetchCompany($companyId)
{
$company = Company::where('id', $companyId)->first();
return response()->json($company);
}
O objetivo final é mostrar algo da resposta em um elemento html.
É possível que seu domínio de sessão não corresponda ao URL do aplicativo e / ou ao host usado para acessar o aplicativo.
1.) Verifique o seu arquivo .env:
SESSION_DOMAIN=example.com
APP_URL=example.com
2.) Verifique config / session.php
Verifique os valores para se certificar de que estão corretos.
2019 Laravel Update, Nunca pensei que postaria isso, mas para aqueles desenvolvedores como eu usando o navegador para buscar a API no Laravel 5.8 e acima. Você precisa passar seu token pelo parâmetro 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));
Isso é semelhante à resposta de Kannan. No entanto, isso corrige um problema em que o token não deve ser enviado para sites de domínio cruzado. Isso só definirá o cabeçalho se for uma solicitação local.
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'));
}
},
});
Isso funciona muito bem para os casos em que você não precisa de um formulário.
use isso no cabeçalho:
<meta name="csrf-token" content="{{ csrf_token() }}">
e isso no seu código JavaScript:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '<?php echo csrf_token() ?>'
}
});
Outra maneira de resolver isso é usar o campo
_token
em dados do ajax e definir o valor de
{{csrf_token()}}
no blade.
Aqui está um código de trabalho que eu tentei no meu final.
$.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);
},
});
Recebi este erro, embora eu já estivesse enviando token CSRF. Acabou que não havia mais espaço no servidor.
Se você já fez as sugestões acima e ainda tem o problema.
Certifique-se de que a variável env:
SESSION_SECURE_COOKIE
Está definido como
false
se
você não tiver um certificado SSL, como no local.
Uma maneira simples de corrigir um status desconhecido em seu console é colocar esse script em seu FORM. {{csrf_field ()}}
Você tem que obter o token csrf ..
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
Depois de fazer o mesmo problema,
< meta name="csrf-token" content="{{ csrf_token() }}" >
Adicionar esta meta tag
< meta name="csrf-token" content="{{ csrf_token() }}" >
Depois disso também o erro surgir, você pode verificar o erro do Ajax. Então, verifique também o erro do 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);
},
});
algumas 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>
...
no meu caso eu esqueci de adicionar a entrada csrf_token ao formulário submetido. então eu fiz este 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
use isso na sua página
<meta name="csrf-token" content="{{ csrf_token() }}">
e no seu ajax usou em dados:
_token: '{!! csrf_token() !!}',
isso é:
$.ajax({
url: '/fetch-company/' + companyId,
dataType : 'json',
type: 'POST',
data: {
_token: '{!! csrf_token() !!}',
},
contentType: false,
processData: false,
success:function(response) {
console.log(response);
}
});
Obrigado.