1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

LaravelでAjaxを使おうとすると、エラーコード419が出た。【1回目】

Posted at

2023年4月にjQueryでJavaScriptを使ってAjax(非同期)の実装を試みる。機能は検索機能。

・開発環境
PHP 8.1.17
Laravel:ver6台(課題の指定がバージョン6)
Composer version 2.5.5
macOS ver13.31

まずは、

【参照】:【jQuery入門】jQueryの基本的な書き方・文法
https://uxmilk.jp/11074
を参照して

blade.php
<head>
 <script src="https://code.jquery.com/jquery-3.6.4.min.js" integrity="sha256-oP6HI9z1XaZNBrJURtCoUT5SUnxFr8s3BzRl+cbzUq8=" crossorigin="anonymous"></script>
</head>

を入れる。

これを参照:https://enginiya.com/entry/laravel-how-to-use-ajaxすると以下のようにしてAjaxをかける。
*正直、上記のブログを参照すると非同期処理を実装できる。書いた俺以外の人はそっちを参考にしてください。

blade.php
 // 検索ボタンを押したら、検索欄とメーカー一覧の欄の情報
 $(function() {
  $(".goods_select_btn").on("click", function() {
     $('.goods-list tbody').empty(); //もともとある要素を空にする
     $('.search-null').remove(); //検索結果が0のときのテキストを消す
     var searchSale = $('.search').val(); //検索ワードを取得
     var selectSale = $('.select').val(); //選択メーカーの情報を取得

  $.ajax({
             type: 'POST',
             url: "{{ route('select') }}",
             data: 'search': searchSale,},
             dataType: 'json', //json形式で受け取る
          }).done(function($search) { //ajaxが成功したときの処理
               $('.sale-list tr').append('<td>$search.value</td>');//sale-listというクラスのテーブルにappend();でtrを追加する。
          }).fail(function() {
                        //ajax通信がエラーのときの処理
                        console.log('どんまい!');
          })
   })
});

コントローラーやルーティングは置いておいて、このbladeを出力しようとするとエラーコード
POST http://localhost:8888/***/public/*** 419 (unknown status)
のようなものが出た。
これをChatGptで検索にかけると
「このエラーは、CSRFトークンが期限切れまたは不一致のために、リクエストが拒否されたことを示しています。
Laravelでは、CSRF攻撃を防止するために、デフォルトで全てのPOSTリクエストに対してCSRFトークンを要求します。このトークンがない場合、リクエストは拒否されます。」
と出る。

つまり、トークン処理を入れろということだ。
今まで、フォームリクエストの時に@csrfを入れたように、jQueryでも入れるということ。

<head>
<meta name="csrf-token" content="{{ csrf_token() }}">
</head>

<body>
 $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $("[name='csrf-token']").attr("content") }, })
</body>

を入れると解決する。

今後Laravelで非同期処理を実装する際にはこれを見直そうと思う。

ちなみにこのbladeだと、
$searchでjsonデータを持ってきているはずだが、出力部分である
<td>$search.value</td>は間違っているため
検索結果は、
[$search.value]としか表示されない笑

正直、カリキュラムの課題を早く終わらせたいから笑えない。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?