web-dev-qa-db-ja.com

PUT vs. POST Zend Frameworkを使用して構築されるファイルをアップロードするRESTful APIの場合

Zend_Rest_Route経由でZend Frameworkを使用してRESTful APIを構築しています。ファイルのアップロードの場合、プロセスを処理するためにPUTまたはPOSTを使用する必要がありますか?REST動詞の定義と可能な限り一致するように努めています参照してください:PUTまたはPOST:REST)

これを理解する方法は、指定されたリソースのコンテンツ全体を更新する場合にのみ、PUTを使用することです。 PUTの正確なURLを知る必要があります。一方、サーバー側のアルゴリズムを使用して、指定されたリソースの下位を作成するコマンドをサーバーに送信する場合は、POSTを使用する必要があります。

これがREST=画像アップロード用のapiであると仮定します。サーバーが画像ファイルを操作する場合(つまり、サムネイルを作成し、サイズを変更する場合は、POSTなど);そして、単に生の画像ファイルをサーバーに保存するだけならPUTを使用しますか?

PUTを使用してファイルのアップロードを処理する場合、プロセスは次のようになります。

  1. ユーザーは、GETリクエストを送信して、PUTするファイルの特定のURLを取得します。
  2. 次に、ユーザーはGET応答からURLにPUT要求を送信します。アップロードされるファイルは、ユーザーがアップロードしたとおりに生のままです。

私はこのようなものにはまったく慣れていません。うまくいけば、私はここで理にかなっています...

これを行うための「最良の」方法を知っているなら、同様にコメントしてください。

47
woran

ここにはかなりの誤解があるようです。 PUT vs POSTはreplace vs createについてではなくreallyではなく、べき等性とリソースの命名についてです。

PUTはべき等の操作です。これを使用して、リソースの名前とそのリソースのコンテンツとして配置するエンティティを指定します(サーバーで生成された追加の場合があります)。重要なことは、「同じこと」のかなり緩やかな定義のために、操作を連続して2回実行すると、1回だけ実行した場合と20回実行した場合と同じ結果になります(バイト単位である必要はありませんバイトは同一ですが、ユーザーが提供した情報はそのままである必要があります)。 PUTによって金融取引がトリガーされることは望ましくありません。

POSTは非べき等の操作です。作成しようとしているリソースの名前を指定する必要はありません(POSThave作成する;必要に応じてリソースの重複を排除することができます)POSTは、「新しく作成された名前でリソースを作成し、名前を教えてください」を実装するためによく使用されます—「新たに作成された名前」が意味するi等性の欠如は、それに適合します新しいリソースが作成される場合、Locationヘッダーでリソースのロケーターを送り返すことは完全に正しいことです。

ここで、クライアントがneverリソース名を作成するというポリシーの位置を取っている場合、POST作成に最適(理論的には提供されたエンティティに基づいて何でもできます)およびPUT更新方法です。すべてではありませんが、多くの理にかなっている多くのRESTfulアプリケーション。ユーザーにリソース名を提供させるファイルシステムは非常に意味があり、PUTが主な作成操作になります(そしてPOSTは空のディレクトリの作成などのあまり一般的でないものに委任されます; WebDAVは、POSTさらに)の必要性を減らします。

概要:作成/更新の観点ではなく、誰がリソース名を作成し、どの操作がべき等であるのかを考えます。 PUTは実際には作成または更新であり、POSTは実際には何でも--------すべきである-繰り返される-意志のない-nilly。

119
Donal Fellows

ファイルのアップロードについては、既存のリソースを置き換える場合を除き、必ずPOSTを使用してください。

RESTでは、POSTは新しいリソースを作成し、PUTは既存のリソースを置き換え、GETはリソースを取得し、DELETEはリソースを削除します。

ソース: http://en.wikipedia.org/wiki/Representational_state_transfer#RESTful_web_services

9
user1080697

RESTは標準ではないため、これは簡単に宗教上の戦いに変わる可能性があります。ただし、「RESTful」と見なされるAtomPubおよびOData標準は、これに同意します。POST = PUT =更新中の作成

3
Robert Levy

簡単な答えは、ファイルのコンテンツ全体を置き換えるため、POSTの代わりにPUTを使用する必要があります。 PUT vs POST

PUTの正確なURLを知る必要があります

いいえ。PUTのURLを知っている必要はありません。つまり、PUT操作の前にPUT URIが存在する必要はありません。リソースが存在しない場合、リソースが作成されます。リソースが既に存在する場合、リソースは新しい表現に置き換えられます。

リンクされた記事を引用するには:

PUTは、特定のURLにページを配置します。既にページが存在する場合は、全体が置き換えられます。そこにページがない場合は、新しいページが作成されます。つまり、DELETEの後に、同じプライマリキーを持つ新しいレコードが挿入されるようなものです。

0
Suresh Kumar