したがって、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」エラーが表示されます。
私は何かを見逃しましたか?
この問題を解決するために何かすべきことはありますか?
POST例えば「/ api/v1/user」のルートに設定されているあなたと同じ問題があります、
POSTMAN(テストAPIへのアプリケーション)を使用して接続しようとすると、405-Method Not Allowedが返されます。
そして、私は私が送信されたURLが使用していることを認識していますhttp'そしてそれを'に変更した後https'(後ろに' s 'が付いています)
その後、私のAPIは通常どおり動作します!
通常、別のサーバーと対話する場合は、「https'
ただし、アプリケーションが同じサーバーにある場合、
'を使用しても構いませんhttp'
私の場合の本当の理由は、異なるサーバーとのやり取りでは、「https'(これは私のサーバー上のセットアップです)
ルートにアクセスしようとするすべてのユーザーがオープンセッション(ログイン)を必要とするため、ルートを分離する必要があります。
これを試して
_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
に変更します
Laravel 5.8の作成時にweb-hooks
ルート。
これらのルートはWebミドルウェアを使用します。そのため、VerifyCsrfTokenルートミドルウェアグループも含まれています。 (参照 app/Http/Kernel.php
)
My POST=リクエストにはCSRFトークンが含まれていないため、この奇妙な動作が発生します。
これを修正するには、Webフックルートの例外を追加 VerifyCsrfTokenミドルウェアにする必要がありました。 (参照 app/Http/Middleware/VerifyCsrfToken.php
)
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'web-hooks/*'
];
上記の解決策は、Webミドルウェアを使用する場合です。ただし、APIルートを作成する場合は、このミドルウェアではCSRF検証が使用されないため、代わりにAPIミドルウェアを使用することをお勧めします。 (参照 app/Providers/RouteServiceProvider.php
)
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
Httpsに変更すると機能します。少なくとも、それは私が経験したことです。 HTTPでPOSTmanを使用すると、常にこの効果があります。
以前同様の問題に直面していましたが、デバッグ後は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タイプを削除したりするだけの簡単なものです...
それが誰かを助けるなら、私はこれとまったく同じ問題を抱えていました。何らかの理由で、物事の組み合わせがそれを修正しました。
NotFoundHttpException in RouteCollection.php line 161
これは、投稿リクエストで「api_token」を送信しなかったためです。何らかの理由で(これが違いを生んだかどうかはわかりませんが)、ミドルウェアをチェーン化することで、ルート:グループに入れる代わりに機能しました。
Route::group(['prefix'=>'api/v1'], function () {
Route::post('/', 'IndexController@index')->middleware('auth:api');
});
長時間の掘削と掘削の後、問題の解決策が見つかりませんでした。
新しいLaravel=プロジェクトをゼロから作成し、古いプロジェクトにあったものをすべて追加しなければなりませんでした。驚いたことに、すべてが完全に機能しました。
とにかく、これを助けようとしたすべての人に感謝します:)乾杯!
このエラーは、リクエスト本文が大きすぎる場合にも発生する可能性があります。私の場合、他の多くのサブオブジェクトを持つすべてのサブオブジェクトを持つオブジェクトを誤って送信していました。リクエストデータを削除して問題を解決しました。
リクエストタイプを確認してくださいGET/POST/PUT/PATCH
両側、つまりフロントエンド(Javascript/TypeScript etc...
)およびバックエンド(Laravel Passport
)同じでなければなりません。