ラボ > Laravel、Lumen:ajax、api絡み
Laravelでajax
作成日:2019-03-28, 更新日:2019-04-03
基本
▼状況にもよるがひとまず、下記。
・ルーティングの設定
・コントローラー
・ajaxの記述
ルーティング(routes/web.php)
・get、postの指定以外は通常のルーティングで大丈夫
※ミドルウェア側でCSRFチェックを行ってくれる
▼get、post送信のどちらを使うかは人それぞれ
Route::get('〇〇〇', '〇〇〇@〇〇〇'); //Route::post('〇〇〇', '〇〇〇@〇〇〇');
コントローラー
・何で返すのか・・・他は通常のコントローラーと変わりなし。
▼最後、何で返すか・・・JSONで返す場合
public function 〇〇〇() { $result = [ 〇〇 => 〇〇, 〇〇 => 〇〇, ]; return \Response::json($result); }
ajax
・ajaxの「headers」にjsonとcsrfの設定が必要
・他は通常のajax
$.ajax({ headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': 〇〇〇, // ←ココにcsrfの値を入れればOK }, 〇〇〇 }).done(function(data) { 〇〇〇 }).fail(function(jqXHR, textStatus, errorThrown) { 〇〇〇 });
csrfの値の設定・取得
調べていると「metaタグにcsrfをセットして、ajax側で取得」という方法をやるのが普通っぽい。
※inputタグじゃなくmetaタグ。headタグ内に記載する感じだろうね。
▼ビューにmetaタグを記載
<head> 〇〇〇 <meta name="csrf-token" content="{{ csrf_token() }}"> 〇〇〇 </head> <body> 〇〇〇 </body>
▼ajaxの「headers」のトコ
$.ajax({ headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': $('input[name="csrf-token"]').attr('content') // ←コイツがcsrfの値 }, 〇〇〇 }).done(function(data) { 〇〇〇 }).fail(function(jqXHR, textStatus, errorThrown) { 〇〇〇 });
失敗時
基本、ルーティングで弾かれるっぽい。
原因に気付けばラクだけど・・・結構めんどい。
▼ajaxのfail()を下記のように指定
$.ajax({ 〇〇 }).done(function(data) { 〇〇 }).fail(function(jqXHR, textStatus, errorThrown) { var errMes = 'XMLHttpRequest : ' + jqXHR.status + "\n" + 'textStatus : ' + textStatus + "\n" + 'errorThrown : ' + errorThrown + "\n"; console.log(errMes); });
※失敗したらコンソールに出力してもらう。
ルーティングでget、postが間違っている場合
▼コンソールに出力
XMLHttpRequest : 405 textStatus : error errorThrown : Method Not Allowed
▼戻り値
{ "message": "", "exception": "Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException", 以下、略
csrfが無い、間違っている場合
▼コンソールに出力
XMLHttpRequest : 419 textStatus : error errorThrown : unknown status
▼戻り値
{ "message": "", "exception": "Symfony\\Component\\HttpKernel\\Exception\\HttpException", 以下、略