186 votes

Laravel 5.5 ajax call 419 (statut inconnu)

Je fais un appel ajax mais je continue à avoir cette erreur:

419 (statut inconnu)

Aucune idée de la cause de ceci n’a été vu sur d’autres articles, il doit faire quelque chose avec le jeton Csrf mais je n’ai pas de formulaire, donc je ne sais pas comment résoudre ce problème.

mon appel:

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

Mon itinéraire:

 Route::post('fetch-company/{companyId}', 'HomeController@fetchCompany');
 

Ma méthode de contrôleur

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

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

Le but ultime est d'afficher quelque chose de la réponse dans un élément html.

384voto

Kannan K Points 2031

Utilisez ceci dans la section head:

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

et obtenez le jeton csrf dans ajax:

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

Veuillez vous reporter à la documentation de Laravel. Csrf_token

36voto

Waqas Bukhary Points 2899

Une autre solution consiste à utiliser le champ _token dans les données ajax et à définir la valeur de {{csrf_token()}} dans la lame. Voici un code de travail que je viens d’essayer de mon côté.

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

    },
});
 

15voto

Jeff Callahan Points 126

Il est possible que votre domaine de session ne corresponde pas à l'URL de votre application et / ou à l'hôte utilisé pour accéder à l'application.

1.) Vérifiez votre fichier .env:

 SESSION_DOMAIN=example.com
APP_URL=example.com
 

2.) Vérifiez config / session.php

Vérifiez les valeurs pour vous assurer qu'elles sont correctes.

13voto

Ceci est similaire à la réponse de Kannan. Toutefois, cela résout le problème suivant: le jeton ne doit pas être envoyé aux sites interdomaines. Cela définira uniquement l'en-tête s'il s'agit d'une requête locale.

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

10voto

Y. Joy Ch. Singha Points 406

utilisez ceci dans votre page

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

et dans votre ajax utilisé dans les données:

 _token: '{!! csrf_token() !!}',
 

C'est:

 $.ajax({
          url: '/fetch-company/' + companyId,
          dataType : 'json',
          type: 'POST',
          data: {
                   _token: '{!! csrf_token() !!}',
                 },
          contentType: false,
          processData: false,
          success:function(response) {
               console.log(response);
          }
     });
 

Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X