ラボ > 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",
    以下、略