php - the - Laravel 5.5 ajax call 419(estado desconocido)
request ajax laravel (18)
Hago una llamada ajax pero sigo recibiendo este error:
419 (estado desconocido)
No tengo idea de qué está causando esto. Vi en otras publicaciones que tiene que ver con el token csrf, pero no tengo forma, así que no sé cómo solucionarlo.
mi llamada:
$(''.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);
}
});
});
Mi ruta:
Route::post(''fetch-company/{companyId}'', ''HomeController@fetchCompany'');
Mi método controlador
/**
* Fetches a company
*
* @param $companyId
*
* @return array
*/
public function fetchCompany($companyId)
{
$company = Company::where(''id'', $companyId)->first();
return response()->json($company);
}
El objetivo final es mostrar algo de la respuesta en un elemento html.
Actualización de Laravel 2019, nunca pensé que publicaría esto, pero para aquellos desarrolladores como yo que utilizamos la API de búsqueda del navegador en Laravel 5.8 y superior. Tienes que pasar tu token a través del parámetro de encabezado.
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));
Aunque tenga un
csrf_token
, si está autenticando las acciones de su controlador utilizando las
Policies
Laravel, también puede tener una respuesta 419.
En ese caso, debe agregar las funciones de política necesarias en su clase de
Policy
.
Es posible que su dominio de sesión no coincida con la URL de su aplicación y / o el host que se utiliza para acceder a la aplicación.
1.) Verifique su archivo .env:
SESSION_DOMAIN=example.com
APP_URL=example.com
2.) Verifique config / session.php
Verifique los valores para asegurarse de que sean correctos.
Este error también ocurre si olvidó incluir esto, en su solicitud de envío ajax (POST), contentType: false, processData: false,
Esto es similar a la respuesta de Kannan. Sin embargo, esto soluciona un problema donde el token no debe enviarse a sitios de dominio cruzado. Esto solo establecerá el encabezado si es una solicitud 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''));
}
},
});
Esto funciona muy bien para aquellos casos en los que no necesita un formulario.
use esto en el encabezado:
<meta name="csrf-token" content="{{ csrf_token() }}">
y esto en tu código JavaScript:
$.ajaxSetup({
headers: {
''X-CSRF-TOKEN'': ''<?php echo csrf_token() ?>''
}
});
Otra forma de resolver esto es usar el campo
_token
en los datos ajax y establecer el valor de
{{csrf_token()}}
en blade.
Aquí hay un código de trabajo que acabo de probar al 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);
},
});
Recibí este error a pesar de que ya había estado enviando el token csrf. Resultó que no quedaba más espacio en el servidor.
Si está cargando .js desde un archivo, debe establecer una variable con csrf_token en su archivo "main" .blade.php donde está importando .js y usar la variable en su llamada 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
}
});
Si ya hizo las sugerencias anteriores y aún tiene el problema.
Asegúrese de que la variable env:
SESSION_SECURE_COOKIE
Se establece en
false
si
no tiene un certificado SSL, como en local.
Tienes que obtener el token csrf.
$.ajaxSetup({
headers: {
''X-CSRF-TOKEN'': $(''meta[name="csrf-token"]'').attr(''content'')
}
});
Después de que surja el mismo problema, simplemente agregue esta metaetiqueta
< meta name="csrf-token" content="{{ csrf_token() }}" >
Después de esto también surge el error, puede verificar el error de Ajax. Entonces también verifique el error 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);
},
});
Una manera simple de corregir un estado desconocido 419 en su consola es poner este script dentro de su FORM. {{csrf_field ()}}
Use esto en la sección de la cabeza:
<meta name="csrf-token" content="{{ csrf_token() }}">
y obtenga el token csrf en ajax:
$.ajaxSetup({
headers: {
''X-CSRF-TOKEN'': $(''meta[name="csrf-token"]'').attr(''content'')
}
});
Consulte la documentación de Laravel csrf_token
algunas referencias =>
...
<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>
...
en mi caso, olvidé agregar la entrada csrf_token al formulario enviado. entonces hice 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
solo serialice los datos del formulario y resuelva su problema.
data: $(''#form_id'').serialize(),
usa esto en tu página
<meta name="csrf-token" content="{{ csrf_token() }}">
y en tu ajax lo usaste en datos:
_token: ''{!! csrf_token() !!}'',
es decir:
$.ajax({
url: ''/fetch-company/'' + companyId,
dataType : ''json'',
type: ''POST'',
data: {
_token: ''{!! csrf_token() !!}'',
},
contentType: false,
processData: false,
success:function(response) {
console.log(response);
}
});
Gracias.
formData = new FormData();
formData.append(''_token'', "{{csrf_token()}}");
formData.append(''file'', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);