これはlaravel 5(以下を参照)の私のテストajaxです
$("#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
});
トリガーリンク
<a href="#" id="try" data-link="{{ url('/test') }}">Try</a>
そして私のルート
Route::post('test', function()
{
return 'Success! ajax in laravel 5';
});
しかし、google chromeでコンソールを実行するとエラーが発生し、期待される応答「return 'Success!ajax in laravel 5'; "
POST http://juliver.laravel.com/test 500(内部サーバーエラー)
私のコードに何が間違っている/問題がありますか?何か不足していますか?
この質問はしばらく存在しますが、受け入れられた答えはありませんが、解決策を示したいと思います。 ajaxで送信し、おそらくCSRFミドルウェアをまだ使用しているため、リクエストに追加のヘッダーを提供する必要があります。
各ページ(またはマスターレイアウト)にメタタグを追加します:<meta name="csrf-token" content="{{ csrf_token() }}">
Javascriptファイル(またはページ内のセクション)に追加します。
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
詳細については、 https://laravel.com/docs/master/csrf#csrf-x-csrf-token を参照してください。
90%のlaravel ajax内部サーバーエラーは、CSRFトークンが欠落しているためです。他の理由には以下が含まれます。
詳細については、こちらで詳細をご覧ください: https://abbasharoon.me/how-to-fix-laravel-ajax-500-internal-server-error/
これは今までに解決されたと思いますが、それでもここで行うための最善のことは、フォームでトークンを送信することです
{!! csrf_field() !!}
そして、あなたの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
});
URLをVerifyCsrfToken.phpミドルウェアに追加できます。 URLはCSRF検証から除外されます。
protected $except = [
"your url",
"your url/abc"
];
App\Http\Middleware\VerifyCsrfToken.phpで、ファイルを次のようなものに更新してみてください。
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);
}
};
これにより、csrf検証をグローバルに無効にすることなく、検証したくない特定のルートを明示的にバイパスできます。
私にとっては、さまざまなもののこのエラーの原因です。ページに2つのajax呼び出しがあります。最初はコメントを保存するためのもの、もう1つはコメントを保存するためのものです。私のroutes.phpではこれがありました:
Route::post('posts/show','PostController@save_comment');
Route::post('posts/show','PostController@save_like');
そして、ajax呼び出しのようなsaveで500内部サーバーエラーが発生しました。だから私は2行目のhttpリクエストタイプをPUTに変更するとエラーがなくなります。 PATCHも使用できます。多分それが役立ちます。
デフォルトではLaravelはCSRFミドルウェアに付属しています。
次の2つのオプションがあります。
代わりにpost jqueryを使用すると、この問題を解決するのに役立ちました
$.post('url', data, function(response) {
console.log(response);
});
あなたはajaxを介してcsrfフィールドを渡す必要がありますここのコードを見てください
$.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");
}
}
});
また、この前にこの入力フィールドを記述する必要があります
<input id="signup-token" name="_token" type="hidden" value="{{csrf_token()}}">
それでもわからない場合は、このビデオをお楽しみください https://www.youtube.com/watch?v=ykXL8o0slJA&t=20s
「use Illuminate\Http\Request;」を追加することを忘れないでください。コントローラーで