ajax post dans laravel 5 retour d'erreur 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 mon itinéraire
Route::post('test', function()
{
return 'Success! ajax in laravel 5';
});
mais il me donne une erreur quand j'exécute la console dans google chrome et il ne renvoie pas la réponse attendue "return' Success! ajax dans laravel 5';"
POST http://juliver.laravel.com/test 500 (Erreur Interne Du Serveur)
quoi de mal/problème de mon code? quoi im manque?
9 réponses
bien que cette question existe depuis un certain temps, mais aucune réponse acceptée n'est donnée, je voudrais vous orienter vers la solution. Parce que vous envoyez avec ajax, et probablement toujours utiliser l'middleware CSRF, vous devez fournir un en-tête supplémentaire avec votre demande.
ajouter une méta-étiquette à chaque page (ou mise en page principale):<meta name="csrf-token" content="{{ csrf_token() }}">
et ajouter à votre fichier javascript (ou section dans 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.
90% de l'erreur du serveur interne ajax de laravel est due à un jeton CSRF manquant. d'autres raisons peuvent inlucde:
- Type de demande erroné(E. g sending post to get)
- Type de données erroné reçu(E. ajax attend JSON et app renvoie la chaîne de caractères)
- Votre .htaccess est mal configuré
- Route Manquante
- Erreur De Code
vous pouvez lire plus à ce sujet dans les détails ici: https://abbasharoon.me/how-to-fix-laravel-ajax-500-internal-server-error/
je suppose que cela a été résolu depuis, mais encore la meilleure chose à faire ici est d'envoyer le jeton avec votre formulaire
{!! csrf_field() !!}
$("#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
});
In App\Http\Middleware\VerifyCsrfToken.php vous pouvez essayer de mettre à jour le fichier à 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 routes spécifiques que vous ne voulez pas vérifier sans désactiver la validation csrf globalement.
Vous pouvez ajouter vos URLs pour VerifyCsrfToken.PHP middleware. Les URLs seront exclues de la vérification CSRF.
protected $except = [
"your url",
"your url/abc"
];
par défaut Laravel est livré avec CSRF middleware.
vous avez 2 options:
- Envoyer le jeton dans vous demande
- Désactiver CSRF middleware (non recommandé): dans l'app\Http\Noyau.php supprime VerifyCsrfToken du tableau $ middleware
pour moi cette erreur cause de choses différentes. j'ai deux appels ajax sur ma page. pour enregistrer un commentaire et un autre pour les enregistrer comme. dans mon parcours.php, j'ai eu ceci:
Route::post('posts/show','PostController@save_comment');
Route::post('posts/show','PostController@save_like');
et j'ai eu 500 erreur interne au serveur pour mon enregistrer comme l'appel ajax. je change donc le type de requête http de la deuxième ligne pour mettre et l'erreur disparaît. vous pouvez utiliser PATCH aussi. peut-être que ça aide.
L'utilisation de post jQuery à la place m'a aidé à résoudre ce problème
$.post('url', data, function(response) {
console.log(response);
});
vous devez passer le champ csrf par ajax s'il vous plaît regarder 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 aussi écrire ce champ d'entrée avant ce
<input id="signup-token" name="_token" type="hidden" value="{{csrf_token()}}">
si vous ne comprenez pas, veuillez profiter de cette vidéo https://www.youtube.com/watch?v=ykXL8o0slJA&t=20s