WebサービスAPIを作成しています(laravel 4.2))。
何らかの理由で、私のコントローラーの1つへのルーティングがHTTPメソッドに基づいて選択的に失敗しています。
私のroutes.phpは次のようになります:
Route::group(array('prefix' => 'v2'),
function()
{
Route::resource('foo', 'FooController',
[ 'except' => ['edit', 'create'] ]
);
Route::resource('foo.bar', 'FooBarController',
[ 'except' => ['show', 'edit', 'create'] ]
);
}
);
したがって、GET/POST/PUT/PATCH/DELETEメソッドのいずれかを試すと、project.dev/v2/foo
またはproject.dev/v2/foo/1234
URL、すべてが完璧に機能します。
しかし、何らかの理由で、GETとPOSTがproject.dev/v2/foo/1234/bar
。他のメソッドは405(MethodNotAllowedHttpException)をスローするだけです。
(fyi、私はAdvanced Rest Client Chrome extension。)を介してリクエストを発行しています。)
どうしたの?
何が欠けていますか?
解決しました!php artisan routes
を実行すると、答えを見つけることができます。
これは、DELETEとPUT/PATCHがバーIDを期待(要求)することを示しました。
この特定のタイプの「バー」は1つしか存在できないため、たまたまそれを無視しています。 project.dev/v2/foo/1234/bar/5678
のように、URLに関係なく単に追加するだけで簡単に修正できます。
Laravelバージョン> 4.2を使用している人は、これを使用してください:
php artisan route:list
これにより、アプリケーションに設定されたルートのリストが表示されます。 PUTおよびDELETEのルートがルートで許可されているかどうかを確認します。 405エラーの主な原因は、これらのメソッドにルートがないためです。
古いLaravelバージョンについてはわかりません。5.2からLaravelを使用しており、put、patch、または削除。
例:
<input type="hidden" name="_method" value="PUT">
チェック https://laravel.com/docs/5.6/routing#form-method-spoofing
非表示の入力フィールドをフォームに追加するだけです
<input type="hidden" name="_method" value="PUT">
そして、フォームメソッドをポストとして保持します
<form method="post" action="{{action('')}}">
送信フォームでメソッドPUTを使用したい場合は、このリンクを表示する必要があります https://laravel.com/docs/5.6/routing#form-method-spoofing しかし、次のようなことをするためにマストをプロジェクトします。
<form>
@method('PUT')
// your_element
スクリプトに追加:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
url: {{ route('your_route', ':id') }},
type: 'POST',
data: data,
dataType: 'json',
cache: false,
}).done(function(data,status){
// anything
}).fail(function(){
// anythig
});