問題
lumen(5.5)で作ったAPIをajaxなどでクロスドメインで実行しようとしても実行されない。
原因
ブラウザからpostやgetでAPIを実行するとまず、optionsでリクエストを投げます。そこでAPIがちゃんとアクセスできるかを確認してます。この機能のことをプリフライトリクエストと呼ぶらしいです。
そのレスポンスで200が返ってきたら、実際に実行したいpostやgetのAPIが実行されます。
ただレスポンスで200以外が返ってきた場合は、postやgetのAPIが実行されない。
laravelの機能で、optionsのリクエストを受けるとrouterに達する前に、405で返してしまいます。
解決策
以下のファイルを\app\Http\Middleware
に作成する。
<?php namespace App\Http\Middleware; use Closure; class CorsMiddleware { public function handle($request, Closure $next) { if($request->isMethod('OPTIONS')) { return response('', 200); } } }
\bootstrap\app.php
に以下を追加する。
$app->middleware([ App\Http\Middleware\CorsMiddleware::class ]);
(【Lumen】Lumen製APIに対してクロスドメインアクセスを行う(CORS)の引用)
これを追加うすることでrequestがrouterに届くよりも前に、requestに対してCorsMiddlewareで処理をすることができる。なのでCorsMiddlewareでリクエストのメソッドがOPTIONSだった場合は200を返す処理を追加しています。