質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

739閲覧

フロントで作ったオブジェクトをLaravel10でのコントローラーファイル投げたいがcorsエラーになる

irebasunglass

総合スコア8

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2023/10/19 06:34

実現したいこと

React(localhost:3000)で生成したオブジェクトLaravel10のコントローラーファイルにを投げてjsonを生成したいと思っております。

JavaScript

1 2async function save() { 3 4 const headers = {"Content-Type": "application/json","Access-Control-Allow-Origin": "http://localhost:3000"}; 5 6 const instance = axios.create({ 7 baseURL : 'http://localhost', 8 headers:headers 9 }); 10 11 try { 12 await instance.post('/players',reobj); 13      //playersというのはLaravelのコントローラーのルート名です 14      reobjというオブジェクトデータをLaravel側に渡したいです 15 } catch (error) { 16 console.log(error) 17 } 18 }

コントローラーでリクエストを受け取りたいと考えております。

php

1 2 3public function __construct() 4 { 5 $this->middleware(CorsMiddleware::class); // CorsMiddlewareというミドルウェアを指定 6 } 7 8public function savePlayers(Request $request) 9 { 10 11 $playersData = $request->all(); 12 $jsonData = json_encode($playersData);  13    //フロントからのリクエストをjsonとして受け取りたい 14 file_put_contents('players_list.json', $jsonData); 15 //既存のJsonファイルにデータを保存 16 17 } 18

本題に入りますが、ミドルウェアを使用してheaderに設定を追加してcorsエラーを解決したいと考えました

CorsMiddlewareというミドルウェアを作成して
下記のようなコードを加えました。

php

1 2namespace App\Http\Middleware; 3 4use Closure; 5use Illuminate\Http\Request; 6use Symfony\Component\HttpFoundation\Response; 7 8class CorsMiddleware 9{ 10 /** 11 * Handle an incoming request. 12 * 13 * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next 14 */ 15 public function handle(Request $request, Closure $next): Response 16 { 17 $headers = [ 18 'Access-Control-Allow-Origin' => 'http://localhost:3000', 19 'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS', 20 'Access-Control-Allow-Headers' => '*', 21 ]; 22 23 //上記でヘッダーの設定を加えてあげることでLaravelへのアクセスを許可しようとしております。 24 25 if ($request->isMethod('OPTIONS')) { 26 return response()->json('OK', 200, $headers); 27 } 28 29 $response = $next($request); 30 foreach ($headers as $key => $value) { 31 $response->header($key, $value); 32 } 33 34 return $response; 35 36 } 37} 38 39

Larabelのコントローラーファイルにアクセスをするためにミドルウェアを作成し
Kernel.phpに下記のようにクラスを追加しました。```ここに言語を入力

php

1'api' => [ 2 \App\Http\Middleware\CorsMiddleware::class,   3 ], 4

web.phpでPlayersControllerという今回使用するコントローラーに対して以下のように記述しました

php

1 2Route::post('/players', 'App\Http\Controllers\PlayersController@savePlayers')->middleware('cors');  3//こちらがアクセスを許可したいコントローラー 4

以上のcorsを許可するミドルウェアを作成し適用したつもりでしたが下記のエラーに至ります

Access to XMLHttpRequest at 'http://localhost/players' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Laravel10なら最初からCORS対応してるのでCorsMiddlewareとかは不要。古い間違った情報を参照している。
https://laravel.com/docs/10.x/routing#cors

web.phpではなくroutes/api.phpに書く。

php

1Route::post('/players'

URLはhttp://localhost/api/players フロントからはこれを指定。
今はweb側に書いてるからできてない。

api/以下なら全部許可、はconfig/cors.phpで設定している。
https://github.com/laravel/laravel/blob/10.x/config/cors.php
api.phpを使えば何もしなくても失敗しない。

投稿2023/10/20 00:16

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

irebasunglass

2023/10/20 10:34

回答ありがとうございました。ミドルウェアの設定はいらなかったですね。 フロントでhttp://localhost/api/playersと指定し 、api.phpに以下のように貼り付けました Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); //デフォルトのルーティング }); Route::post('/players', 'App\Http\Controllers\PlayersController@savePlayers'); //追加分 しかしながら同じエラーが起こってしまいます 表記の仕方は正しいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問