web-dev-qa-db-ja.com

Laravel 5.2:POST要求は常に「405 Method Not Allowed」を返します

したがって、Laravel 5.2でAPIを開発しており、重要な問題に直面しています。

アプリのユーザーを管理するUserControllerがあります。

これは私のroutes.phpファイルです:

Route::group(array('prefix' => 'api/v1'), function() {    
   Route::post('user', 'UserController@store');
});

そして、私はそのように定義されたUserControllerを持っています:

class UserController extends Controller {

   public function index() {
       return 'Hello, API';
   }

   public function create(){
   }

   public function store(Request $request) {
       $user = new User;
       $user->email = $request->email;
       $user->password = $request->password;
       $user->fbId = $request->fbId;
       $user->ggId = $request->ggId;
       $user->firstName = $request->firstName;
       $user->lastName = $request->lastName;
       $user->imageUrl = $request->imageUrl;
       $user->country = $request->country;
       $user->mobile = $request->mobile;
       $user->gender = $request->gender;
       $user->client = $request->client;

       $user->save();

       return Response::json(array(
           'error' => false,
           'userId' => $user->id),
           200
       );
   }

   public function update(Request $request, $id) {
   }
}

そして、これはphp artisan route:listの出力です

+--------+--------+-------------+------+-------------------------------------------+------------+
| Domain | Method | URI         | Name | Action                                    | Middleware |
+--------+--------+-------------+------+-------------------------------------------+------------+
|        | POST   | api/v1/user |      | App\Http\Controllers\UserController@store | web        |
+--------+--------+-------------+------+-------------------------------------------+------------+

POSTリクエストをテストするためにPostmanを使用しています。/api/v1/userにPOSTリクエストを行うたびに、「405 Method Not Allowed」エラーが表示されます。

私は何かを見逃しましたか?

この問題を解決するために何かすべきことはありますか?

6

POST例えば「/ api/v1/user」のルートに設定されているあなたと同じ問題があります、

POSTMAN(テストAPIへのアプリケーション)を使用して接続しようとすると、405-Method Not Allowedが返されます。

そして、私は私が送信されたURLが使用していることを認識していますhttp'そしてそれを'に変更した後https'(後ろに' s 'が付いています)
その後、私のAPIは通常どおり動作します!

通常、別のサーバーと対話する場合は、「https'
ただし、アプリケーションが同じサーバーにある場合、
'を使用しても構いませんhttp'

私の場合の本当の理由は、異なるサーバーとのやり取りでは、「https'(これは私のサーバー上のセットアップです)

16
bathulah mahir

ルートにアクセスしようとするすべてのユーザーがオープンセッション(ログイン)を必要とするため、ルートを分離する必要があります。

これを試して

_Route::group(array('prefix' => 'api/v1'), function() {

    Route::post('/','UserController@store');

    Route::get('/', 'UserController@index');

    Route::group(array('before' => 'auth.basic'), function() {

        Route::post('{user}', 'UserController@update');

    });
});
_

許可されたユーザーのルートは2番目のグループにある必要があります

また、許可されていない405メソッドは_$user->id_ $request->user()->idに変更します

7

CSRFトークンがありません

Laravel 5.8の作成時にweb-hooksルート。

これらのルートはWebミドルウェアを使用します。そのため、VerifyCsrfTokenルートミドルウェアグループも含まれています。 (参照 app/Http/Kernel.php

My POST=リクエストにはCSRFトークンが含まれていないため、この奇妙な動作が発生します。

CSRF例外を追加

これを修正するには、Webフックルートの例外を追加 VerifyCsrfTokenミドルウェアにする必要がありました。 (参照 app/Http/Middleware/VerifyCsrfToken.php

/**
 * The URIs that should be excluded from CSRF verification.
 *
 * @var array
 */
protected $except = [
    'web-hooks/*'
];

APIミドルウェアを使用する

上記の解決策は、Webミドルウェアを使用する場合です。ただし、APIルートを作成する場合は、このミドルウェアではCSRF検証が使用されないため、代わりにAPIミドルウェアを使用することをお勧めします。 (参照 app/Providers/RouteServiceProvider.php

    Route::prefix('api')
        ->middleware('api')
        ->namespace($this->namespace)
        ->group(base_path('routes/api.php'));
2
Bram Verstraten

Httpsに変更すると機能します。少なくとも、それは私が経験したことです。 HTTPでPOSTmanを使用すると、常にこの効果があります。

1
anabeto93

以前同様の問題に直面していましたが、デバッグ後はPostmanの問題であり、コードに関連するものはありませんでした!

ターミナルを開いて、curlで同じリクエストを作成してみてください。

curl -X POST -H "Accept: application/json" -F "[email protected]" -F "password=secret" -F "firstName=Mahmoud"  -F "lastName=Zalt" ....... "http://your-domain.com/api/v1/user"

これが機能した場合、Postman自体でいくつかの設定を変更する必要があります。私が何をしたのか本当に思い出せません!しかし、デフォルトのヘッダーを変更したり、Authorizationタイプを削除したりするだけの簡単なものです...

0
Mahmoud Zalt

それが誰かを助けるなら、私はこれとまったく同じ問題を抱えていました。何らかの理由で、物事の組み合わせがそれを修正しました。

  1. 明らかなポイントは、NotFoundHttpException in RouteCollection.php line 161これは、投稿リクエストで「api_token」を送信しなかったためです。
  2. 何らかの理由で(これが違いを生んだかどうかはわかりませんが)、ミドルウェアをチェーン化することで、ルート:グループに入れる代わりに機能しました。

    Route::group(['prefix'=>'api/v1'], function () {
        Route::post('/', 'IndexController@index')->middleware('auth:api');
    });
    
0
Robert Pounder

長時間の掘削と掘削の後、問題の解決策が見つかりませんでした。

新しいLaravel=プロジェクトをゼロから作成し、古いプロジェクトにあったものをすべて追加しなければなりませんでした。驚いたことに、すべてが完全に機能しました。

とにかく、これを助けようとしたすべての人に感謝します:)乾杯!

0

このエラーは、リクエスト本文が大きすぎる場合にも発生する可能性があります。私の場合、他の多くのサブオブジェクトを持つすべてのサブオブジェクトを持つオブジェクトを誤って送信していました。リクエストデータを削除して問題を解決しました。

0
mopo922

リクエストタイプを確認してくださいGET/POST/PUT/PATCH両側、つまりフロントエンドJavascript/TypeScript etc...)およびバックエンドLaravel Passport)同じでなければなりません。

0
Ajit Das