web-dev-qa-db-ja.com

PATCHおよびPUT要求がフォームデータで機能しない

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()で問題ありません。
  • X-www-form-urlencodedを使用すると、$request->all()PATCHPUT、およびPOSTで問題ありません。
  • ただし、PostmanからPUTPATCHをフォームデータとともに送信する場合、$request->all()は空になります(パラメーターはバックエンドに送信されません)。

現時点での解決策は、モデルの更新にPOSTを使用することです。 Postmanからフォームデータを送信したときにPATCHPUTが機能しない理由を知りたい。

5
notalentgeek

これは既知の問題であり、次のGithub comment による回避策の提案は、PATCH/PUTリクエストを送信するときに次のことを行う必要があるということです。

ファイルを表示するには、POSTを送信し、_methodをPUT(フォームの送信と同じ)に設定する必要があります。

したがって、基本的には、POST実際のメソッドを設定するパラメーターを含むリクエストを送信し、Laravelはそれを理解しているようです。

ドキュメント

HTMLフォームはPUTPATCH、または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>
15
Script47

Laravel PATCHおよびPUTメソッドは_form-data_で動作しません。Symfonyの既知の問題であり、PHP(そのためのGoogle-Laravelは多くのSymfonyを使用します基盤パッケージ、リクエストを含む)。

  1. リクエストでファイルを渡す必要がない場合は、json content-typeを使用して_form-data_をrawに変更します。例:_{"name":"changed"}_。これは_php://input_として読み取られ、コードは正常に機能するはずです($request->all()は現在_["name" => "changed]_です)。

  2. ファイルを渡す必要がある場合、私の意見では、DO NOT REST APIメソッド内で渡します。必要なことを行うために別のメソッドを書くことができますファイルを使用して(例:_POST form-data_->ファイルをアップロード-> dbを更新->ファイルパス/ url/base64コンテンツを返す)、その出力/結果を使用してパッチを続行できます/ putメソッド(raw with json content-type)。APIでファイルを操作するときは常にそうします。

この助けを願っています!

2
vietanhyt

フォームのメディアタイプにはPATCHに定義されたセマンティクスがないため、使用することは本当に悪い考えです( https://www.rfc-editor.org/errata/eid3169 を参照)。

PUTの場合、予想される動作は、フォームエンコードされたペイロードのみを(その形式で)保存することです。これは本当にあなたがここで欲しいものですか?

1
Julian Reschke