web-dev-qa-db-fra.com

ajax post in laravel 5 erreur de retour 500 (erreur interne du serveur)

c'est mon test ajax dans laravel 5 (voir ci-dessous)

$("#try").click(function(){
    var url = $(this).attr("data-link");
    $.ajax({
        url: "test",
        type:"POST",
        data: { testdata : 'testdatacontent' },
        success:function(data){
            alert(data);
        },error:function(){ 
            alert("error!!!!");
        }
    }); //end of ajax
});

et le lien de déclenchement

<a href="#" id="try" data-link="{{ url('/test') }}">Try</a>

et ma route

Route::post('test', function()
{
    return 'Success! ajax in laravel 5';
});

mais cela me donne une erreur lorsque je lance la console dans google chrome et il ne renvoie pas la réponse attendue "return 'Success! ajax in laravel 5';"

POST http://juliver.laravel.com/test 500 (erreur interne du serveur)

quoi de mal/problème à mon code? quelque chose que je manque?

19
Juliver Galleto

Bien que cette question existe pendant un certain temps, mais aucune réponse acceptée n’est donnée, je voudrais vous indiquer la solution. Étant donné que vous envoyez avec ajax et que vous utilisez probablement encore le middleware CSRF, vous devez fournir un en-tête supplémentaire avec votre demande.

Ajoutez une méta-étiquette à chaque page (ou disposition maître): <meta name="csrf-token" content="{{ csrf_token() }}">

Et ajoutez à votre fichier javascript (ou à une section de la page):

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

Voir https://laravel.com/docs/master/csrf#csrf-x-csrf-token pour plus de détails.

45
Ben

90% de l'erreur laravel ajax internal server est due à un jeton CSRF manquant. D'autres raisons peuvent expliquer ce qui suit:

  • Type de requête incorrect (par exemple, envoi d'un message à obtenir)
  • Type de données incorrect reçu (par exemple, ajax attend JSON et chaîne renvoyée par l'application)
  • Votre .htaccess est mal configuré
  • Route manquante
  • Erreur de code

Vous pouvez lire plus à ce sujet en détail ici: https://abbasharoon.me/how-to-fix-laravel-ajax-500-internal-server-error/

10
Meta Pakistani

Je suppose que cela a déjà été résolu, mais la meilleure chose à faire ici est d’envoyer le jeton avec votre formulaire.

{!! csrf_field() !!}

et puis dans votre ajax

$("#try").click(function(){
var url = $(this).attr("data-link");
$.ajax({
    url: "test",
    type:"POST",
    data: { '_token': token, 'someOtherData': someOtherData },
    success:function(data){
        alert(data);
    },error:function(){ 
        alert("error!!!!");
    }
}); //end of ajax
});
7
Khan Shahrukh

Vous pouvez ajouter vos URL au middleware VerifyCsrfToken.php. Les URL seront exclues de la vérification CSRF.

protected $except = [
    "your url",
    "your url/abc"
];
3
Danish Jamshed

Dans App\Http\Middleware\VerifyCsrfToken.php, vous pouvez essayer de mettre à jour le fichier pour obtenir quelque chose comme:

class VerifyCsrfToken extends BaseVerifier {

    private $openRoutes =
    [
        ...excluded routes
    ];

    public function handle($request, Closure $next)
    {
        foreach($this->openRoutes as $route)
        {
            if ($request->is($route))
            {
                return $next($request);
            }
        }

        return parent::handle($request, $next);
    }
};

Cela vous permet de contourner explicitement des itinéraires spécifiques que vous ne voulez pas vérifier sans désactiver la validation csrf globalement.

3
aethergy

pour moi cette erreur cause de trucs différents. J'ai deux appel ajax dans ma page. le premier pour sauvegarder le commentaire et un autre pour le sauvegarder, comme. dans mon routes.php j'avais ceci:

Route::post('posts/show','PostController@save_comment');
Route::post('posts/show','PostController@save_like');

et j'ai eu 500 erreur de serveur interne pour ma sauvegarde comme appel ajax. donc je change le type de requête http seconde ligne en PUT et l'erreur disparaît. vous pouvez aussi utiliser PATCH. peut-être que ça aide.

1
Setmax

Par défaut Laravel est livré avec le middleware CSRF.

Vous avez 2 options:

  1. Envoyer un jeton dans votre demande
  2. Désactiver le middleware CSRF (non recommandé): dans app\Http\Kernel.php, supprimez VerifyCsrfToken du tableau $ middleware
1
Bostjan

Utiliser post jquery m'a aidé à résoudre ce problème

$.post('url', data, function(response) {
    console.log(response);
});
1
cescgie

vous devez passer le champ csrf via ajax s'il vous plaît regardez le code ici

$.ajax({
                                        type: "POST",
                                        url:'{{URL::to("/delete-specialist")}}',
                                        data: {
                                            id: id,

                                            _token: $('#signup-token').val()
                                        },
                                        datatype: 'html',
                                        success: function (response) {
                                            if(response=="deleted"){
                                                $("#"+id).hide();
                                                $("#message").html("successfully deleted");
                                            }

                                        }

                                    });

et vous devez également écrire ce champ de saisie avant cette

<input id="signup-token" name="_token" type="hidden" value="{{csrf_token()}}">

toujours si vous ne comprenez pas s'il vous plaît profiter de cette vidéo https://www.youtube.com/watch?v=ykXL8o0slJA&t=20s

1

n'oubliez pas d'ajouter "utilisez Illuminate\Http\Request;" sur votre contrôleur

0
user3608756