2012-06-04 9 views
24

べきではありませんがPUTは、PUTは冪等であるため、Updateに使用CreatePOSTに使用することべきではありません。REST - 作成= PUTやPOST =アップデート

このように、同じオーダーの複数のPUTは1つのオーダーのみを配置しますか?

+1

http://stackoverflow.com/questions/630453/put-vs-post-in-rest/2590281#2590281 –

答えて

47

根本的な相違点は、PUTが既知のリソース用であり、そのため更新に使用され、rfc2616のas stated hereです。

POST及びPUT要求との間の根本的な違いは、Request-URIの異なる意味に反映 あります。 POST要求内のURIは、同封の エンティティを処理するリソースを識別します。そのリソースは、データ受け入れプロセス、 他のプロトコルへのゲートウェイ、または注釈を受け入れる別のエンティティである可能性があります。 これとは対照的に、PUT要求におけるURIは 要求で囲まれたエンティティを識別する - ユーザエージェントは、URIが意図されているものを知っていると サーバは、いくつかの他のリソースへの要求を適用することを試みてはいけません。 サーバは、要求が異なるURI

に適用されることを希望する場合は、しかし、名前に自分自身をベースとどこから来ている私は見ています。

私は通常、自分のリクエストの内容(ほとんどの場合フォームの値としてのパラメータ)を処理するURIである必要があり、したがって新しいリソースを作成するためのPOSTを見ています。私の要求(/ users/1234)、既に存在するリソース。

私はこの命名法が長い道のりを戻ってくると信じています。初期のウェブを考えてみましょう。メッセージボードにメッセージをPOSTに送信し、後でメッセージにPUT追加コンテンツを追加することができます。そして、新たな資源の可能なURIは、クライアントのために知られている場合だけ

+9

これを少し拡張するために、私はPUTを同義語と考えるほうがはっきりしていると思います"set child"の同義語として "set"とPOST。私はあなたに間違った直感を与えるので、どちらも "作成"または "更新"とは思わないでしょう。 –

+0

良い点@JohnWatts、これは典型的な使用例ですが、まれにここで標準から何かをしなければならないことはめったにありません。非標準的な方法でリクエストを処理している場合は、最初にやろうとしていることの意図を再考することができます。 –

+8

Martin Fowlerは「[POST/PUT]と[作成]/[更新]の間の対応が間違っている人もいます(http://martinfowler.com/articles/richardsonMaturityModel.html) " –

5

PUTを作成するために使用すべきです。新しいURIは、リソース表現のサービスによって広告される可能性があります。例えば、サービスは何らかの種類の提出フォームを提供し、その上にアクションリソースを指定することができます。アクションURIは、新しいリソースのあらかじめ設定されたURIにすることができます。この場合、最初のPUT要求がPUT要求に続くリソースを正常に作成する場合にのみ、それを置き換えます。

これは、更新のためにPOSTを使用しても大丈夫だ、それはPOSTのみの操作「を作成する」ためのものであることを言われることはなかったです。

0

それが依存.. あなたは両方と/更新サイト/レコードを作成することができます。 クライアントがURIを指定しているときは、PUTを使用します。例: Dreamweaver、PUTなどのコードエディタは、使用する正しいプロトコルです。

も、このスレッドを見て:put vs post in rest

+0

どちらのタイプのリクエストでもそれらを作成したり更新したりすることはできません.GETを使ってリソースを実際に作成するか、本当に必要な場合はDELETEできます。それはRESTの慣例と関係があります。いずれの場合でも、任意の要求にURIを指定する必要があります。 –

4

HTTPメソッドとCRUDの間には、厳密な対応はありません。これはいくつかのフレームワークで採用されている規約ですが、RESTの制約とは関係ありません。

PUT要求が完全に現在の内容を無視して、囲まれた表現で指定されたURIにあるものは何でも交換するサーバに要求します。良い類推は、シェル内のmvコマンドです。存在しない場合は新しいファイルを作成し、存在する場合は置き換えます。どちらの場合も、そこにあるものは完全に無視されます。完全な表現を送信している限り、これを使って何かを作成したり更新したりすることができます。

POSTは、あらかじめ定義されたルールに従ってペイロードを処理するようにターゲットリソースに依頼するため、HTTPプロトコルで標準化されていない操作に使用する方法です。これは、他のメソッドから機能を複製していない限り、例えばが何かを行うことができることを意味します。GETを使用する必要がある場合には取り出しのためにPOSTを使用し、適切に文書化します。

正確な状況に応じて、作成と更新の両方を行うことができますが、PUTではAPIのすべてについて一貫したセマンティクスが必要で、部分的な更新はできません。POSTでは何でもできますどのように正確に機能するかを文書化している限り、必要になります。

+0

これは最も単純で不自然な反応だと思います。フレームワーク、REST、方法論には関係ありません。あなたが強制すべき動詞を奨励したいというプロセスにかかっています。 PUTはあなたがしたいことを何でもPOSTします!クリスタルクリア! –

関連する問題