Laravel=を使用してRESTFULアプリケーションを作成し、Postmanでアプリケーションをテストしています。現在、データが送信された場合、PATCH
またはPUT
に問題があります。フォームデータ付きのPostmanから。
_// Parameter `{testimonial}` will be sent to backend.
Route::post ('testimonials/{testimonial}', 'TestimonialController@update');
// Parameter `{testimonial}` will not be sent to backend (`$request->all()` will be empty) if sent from Postman with form-data.
Route::patch ('testimonials/{testimonial}', 'TestimonialController@update');
Route::put ('testimonials/{testimonial}', 'TestimonialController@update');
_
POST
に対して$request->all()
で問題ありません。$request->all()
はPATCH
、PUT
、およびPOST
で問題ありません。PUT
とPATCH
をフォームデータとともに送信する場合、$request->all()
は空になります(パラメーターはバックエンドに送信されません)。現時点での解決策は、モデルの更新にPOST
を使用することです。 Postmanからフォームデータを送信したときにPATCH
とPUT
が機能しない理由を知りたい。
これは既知の問題であり、次のGithub comment による回避策の提案は、PATCH
/PUT
リクエストを送信するときに次のことを行う必要があるということです。
ファイルを表示するには、POSTを送信し、_methodをPUT(フォームの送信と同じ)に設定する必要があります。
したがって、基本的には、POST実際のメソッドを設定するパラメーターを含むリクエストを送信し、Laravelはそれを理解しているようです。
ドキュメント :
HTMLフォームは
PUT
、PATCH
、またはDELETE
リクエストを作成できないため、非表示の_method
これらのHTTP動詞を偽装するフィールド。@method
Bladeディレクティブは、このフィールドを作成できます。
<form action="/foo/bar" method="POST">
@method('PUT')
...
</form>
または、 method_field
上記を行うヘルパー関数:
Method_field関数は、フォームのHTTP動詞のスプーフィングされた値を含むHTML非表示入力フィールドを生成します。たとえば、Blade構文を使用する場合:
<form method="POST">
{{ method_field('PUT') }}
</form>
Laravel PATCHおよびPUTメソッドは_form-data
_で動作しません。Symfonyの既知の問題であり、PHP(そのためのGoogle-Laravelは多くのSymfonyを使用します基盤パッケージ、リクエストを含む)。
リクエストでファイルを渡す必要がない場合は、json content-typeを使用して_form-data
_をraw
に変更します。例:_{"name":"changed"}
_。これは_php://input
_として読み取られ、コードは正常に機能するはずです($request->all()
は現在_["name" => "changed]
_です)。
ファイルを渡す必要がある場合、私の意見では、DO NOT REST APIメソッド内で渡します。必要なことを行うために別のメソッドを書くことができますファイルを使用して(例:_POST form-data
_->ファイルをアップロード-> dbを更新->ファイルパス/ url/base64コンテンツを返す)、その出力/結果を使用してパッチを続行できます/ putメソッド(raw
with json content-type)。APIでファイルを操作するときは常にそうします。
この助けを願っています!
フォームのメディアタイプにはPATCHに定義されたセマンティクスがないため、使用することは本当に悪い考えです( https://www.rfc-editor.org/errata/eid3169 を参照)。
PUTの場合、予想される動作は、フォームエンコードされたペイロードのみを(その形式で)保存することです。これは本当にあなたがここで欲しいものですか?