web-dev-qa-db-ja.com

ajax post in laravel 5 return error 500(Internal Server Error)

これは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(内部サーバーエラー)

私のコードに何が間違っている/問題がありますか?何か不足していますか?

19
Juliver Galleto

この質問はしばらく存在しますが、受け入れられた答えはありませんが、解決策を示したいと思います。 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 を参照してください。

45
Ben

90%のlaravel ajax内部サーバーエラーは、CSRFトークンが欠落しているためです。他の理由には以下が含まれます。

  • 間違ったリクエストタイプ(例:投稿を送信して取得)
  • 間違ったデータ型を受け取りました(たとえば、ajaxはJSONを予期しており、アプリは文字列を返します)
  • .htaccessの設定が間違っています
  • ルートがありません
  • コードエラー

詳細については、こちらで詳細をご覧ください: https://abbasharoon.me/how-to-fix-laravel-ajax-500-internal-server-error/

10
Meta Pakistani

これは今までに解決されたと思いますが、それでもここで行うための最善のことは、フォームでトークンを送信することです

{!! 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
});
7
Khan Shahrukh

URLをVerifyCsrfToken.phpミドルウェアに追加できます。 URLはCSRF検証から除外されます。

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

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検証をグローバルに無効にすることなく、検証したくない特定のルートを明示的にバイパスできます。

3
aethergy

私にとっては、さまざまなもののこのエラーの原因です。ページに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も使用できます。多分それが役立ちます。

1
Setmax

デフォルトではLaravelはCSRFミドルウェアに付属しています。

次の2つのオプションがあります。

  1. リクエストでトークンを送信
  2. CSRFミドルウェアを無効にします(推奨されません):app\Http\Kernel.phpで$ middleware配列からVerifyCsrfTokenを削除します
1
Bostjan

代わりにpost jqueryを使用すると、この問題を解決するのに役立ちました

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

あなたは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

1

「use Illuminate\Http\Request;」を追加することを忘れないでください。コントローラーで

0
user3608756