RESTにおけるPUTとPOSTの比較

http rest post put


HTTP/1.1仕様によると

POSTメソッドは、オリジンサーバがで識別されるリソースの新しい従属として、リクエストに囲まれたエンティティ受け入れることを要求するために使用される Request-URIRequest-Line

つまり、 POST を使用してを作成ます

PUT囲まれたエンティティが供給下で保存する方法の要求 Request-URIRequest-URI が既存のリソースを参照する場合、囲まれたエンティティーは、起点サーバーに存在するエンティティーの変更バージョンと見なされるべきです(SHOULD)。場合 Request-URI 既存のリソースを指していない、とURIが要求するユーザエージェントによって新しいリソースとして定義されることが可能であることを、オリジンサーバはそのURIを持つリソースを作成することができます。」

つまり、 PUT はの作成または置換に使用されます

では、リソースの作成にはどちらを使うべきなのでしょうか?それともどちらかが両方に対応する必要があるのでしょうか?




Answer 1 Brian R. Bondy


Overall:

作成にはPUTとPOSTの両方を使用できます。

何を使うべきかを区別するために、"何のためにアクションを実行しているのか?"と尋ねる必要があります。質問をするためのAPIを設計しているとしましょう。POSTを使用したい場合、質問のリストに対してこれを行います。もしPUTを使用したい場合は特定の質問に対して行います。

どちらも使用できるので、RESTfulな設計ではどちらを使用すればよいですか。

PUTとPOSTの両方をサポートする必要はありません。

どちらを使うかはあなた次第です。しかし、リクエストで参照しているオブジェクトに応じて正しいものを使うことを覚えておいてください。

いくつかの考慮事項があります。

  • 作成した URL オブジェクトに明示的に名前を付けるのか、それともサーバに任せるのか?名前を付ける場合はPUTを使用します。サーバに決定させる場合は POST を使用します。
  • PUTはidempotentなので、オブジェクトを2回PUTしても何の効果もありません。これは良いプロパティなので、可能であればPUTを使いたいところです。
  • 同じオブジェクトURLのPUTでリソースを更新または作成することができます。
  • POSTでは、2つのリクエストが同時に来てURLを変更することができ、それらはオブジェクトの異なる部分を更新することができます。

例:

これに関するSOの別の回答の一部として、私は以下を書きました

POST:

リソースの変更と更新に使用します。

POST /questions/<existing_question> HTTP/1.1
Host: www.example.com/

以下はエラーになるので注意してください。

POST /questions/<new_question> HTTP/1.1
Host: www.example.com/

URLがまだ作成されていない場合は、名前を指定するときにPOSTを使用して作成しないでください。 <new_question> がまだ存在しないため、これにより「リソースが見つかりません」エラーが発生します。 最初にサーバーの <new_question> リソースをPUTする必要があります。

POSTを使ってリソースを作成するには、次のようなことができます。

POST /questions HTTP/1.1
Host: www.example.com/

この場合、リソース名が指定されていないと、新しいオブジェクトのURLパスが返されることに注意してください。

PUT:

リソースの作成や上書きに使用します。リソースの新しいURLを指定している間。

新しいリソースのために。

PUT /questions/<new_question> HTTP/1.1
Host: www.example.com/

既存のリソースを上書きします。

PUT /questions/<existing_question> HTTP/1.1
Host: www.example.com/

さらに、もう少し簡潔に説明すると、RFC 7231のセクション4.3.4 PUTには次のように記載されています(強調が追加されています)。

4.3.4。置く

PUTメソッドは、ターゲットリソースの状態を created か、要求メッセージのペイロードで囲まれた表現で定義された状態に replaced を要求します。




Answer 2 Cheeso


というアサーションをウェブ上で見つけることができます。

どちらが正しいとは言えません。


アクションのべきに基づいて、PUTとPOSTのどちらかを選択することをお勧めします。

PUTは、リソースを配置することを意味します。つまり、指定されたURLで利用可能なものをすべて別のものに完全に置き換えます。定義により、PUTはべき等です。何度でも繰り返してください。結果は同じです。 x=5 はべき等です。以前に存在したかどうかに関係なく、リソースをPUTできます(たとえば、作成または更新)。

POSTはリソースを更新するか、補助リソースを追加するか、または変更を引き起こします。POSTは、 x++ がべき等ではないように、べき等ではありません。


この引数で、PUTは作成するモノのURLがわかっているときに作成するためのものです。POSTは、作成したいモノのカテゴリの「工場」や「マネージャー」のURLがわかっているときに作成するためのものです。

so:

POST /expense-report

or:

PUT  /expense-report/10929



Answer 3 Nigel Thorne


  • URLへのPOSTは、サーバー定義の URLに子リソース作成します。
  • URLへのPUTは、クライアント定義の URL でリソース全体を作成/置換します。
  • URLへのPATCHは、そのクライアント定義のURLでリソースの一部更新します。

PUTおよびPOSTに関連する仕様はRFC 2616§9.5ffです。

POSTは子リソースを作成するため、 /items へのPOST は /items リソースの下にあるリソースを作成します。例えば。 /items/1 。同じポストパケットを2回送信すると、2つのリソースが作成されます。

PUT、クライアントが認識しているURLでリソースを作成または置換するためのものです

したがって、PUTは、リソースが作成される前にクライアントがURLをすでに知っているCREATEの候補にすぎません。例えば。 /blogs/nigel/entry/when_to_use_post_vs_put (タイトルがリソースキーとして使用されるため)

PUTは、既知のURLにあるリソースが既に存在する場合はそれを置き換えます。そのため、同じリクエストを2回送信しても効果はありません。つまり、PUTの呼び出しはべき等です。

RFCは次のように読みます。

POSTリクエストとPUTリクエストの根本的な違いは、Request-URIの意味の違いに反映されています。POSTリクエストのURIは、囲まれたエンティティを処理するリソースを識別します。そのリソースは、データを受け取るプロセス、他のプロトコルへのゲートウェイ、 またはアノテーションを受け取る別個のエンティティであるかもしれない。対照的に、PUTリクエストのURIはリクエストで囲まれたエンティティを 識別する。ユーザーエージェントはどのURIが意図されているかを知っており、サーバー はそのリクエストを他のリソースに適用しようとしてはならない[MUST NOT]。サーバーがリクエストを別のURIに適用することを望む場合、サーバーはそのリク エストを他のリソースに適用しようとしてはならない[MUST NOT]。

注: PUTは主にリソースを更新するために(リソース全体を置き換えることによって)使用されてきましたが、最近、PUTがリソース全体を置き換えることを指定しているため、既存のリソースの更新にPATCHを使用する動きがあります。RFC 5789。

2018年更新:PUTを回避するためにできるケースがあります。「PUTなしのREST」を参照してください。

「RESTなしのPUT」手法を使用すると、消費者は新しい「統一された」リクエストリソースを投稿する必要があります。前述のように、顧客の郵送先住所の変更は、新しい「ChangeOfAddress」リソースへのPOSTであり、異なる郵送先住所フィールド値を持つ「顧客」リソースのPUTではありません。

取らThoughtWorks社のプラカシュSubramaniamによるリソースモデリング- REST APIデザイン

これは、複数のクライアントが単一のリソースを更新する際の状態遷移の問題を回避するためにAPIを強制的に使用し、イベントソーシングやCQRSとよりうまくマッチします。作業が非同期で行われる場合、変換をPOSTして適用されるのを待つのが適切だと思われます。




Answer 4 7hi4g0


Summary:

Create:

以下のようにPUTとPOSTの両方で行うことができます。

PUT

作成した新しいリソースnewResourceId /リソースURI、または下、識別子としてのコレクション

PUT /resources/<newResourceId> HTTP/1.1 

POST

作成/リソースURI、または下に新しいリソースをコレクション。通常、識別子はサーバーから返されます。

POST /resources HTTP/1.1

Update:

次の方法でPUTを使用してのみ実行できます。

PUT

/ resources URIまたはcollectionの下で、既存のリソースIDを識別子として使用してリソースを更新します。

PUT /resources/<existingResourceId> HTTP/1.1

Explanation:

一般としてRESTとURIを扱うとき、あなたは持っている一般的な、左特定権利ジェネリック医薬品は、通常と呼ばれているコレクション、より具体的な項目を呼び出すことができるリソース。ことに注意してくださいリソースを含めることができるコレクションを

Examples:

<-一般-特定->

URI: website.com/users/john
website.com  - whole site
users        - collection of users
john         - item of the collection, or a resource

URI:website.com/users/john/posts/23
website.com  - whole site
users        - collection of users
john         - item of the collection, or a resource
posts        - collection of posts from john
23           - post from john with identifier 23, also a resource

あなたはPOSTを使用する場合、あなたはしているいつもの参照のうえコレクションなので、いつでもあなたが言います:

POST /users HTTP/1.1

新しいユーザーをユーザーコレクションに投稿しています

続けていくと、こんな感じで試してみてください。

POST /users/john HTTP/1.1

それは機能しますが、意味的には、ユーザーコレクションの下のジョンコレクションにリソースを追加することを示しています

PUTを使用すると、コレクション内のリソースまたは単一のアイテムを参照することになります。だからあなたが言うとき:

PUT /users/john HTTP/1.1

サーバーの更新を指示するか、存在しない場合は、ユーザーコレクションの下にあるjohn リソースを作成します

Spec:

スペックの重要な部分を強調してみます。

POST

POSTのメソッドは、オリジンサーバがその要求に使用されて受け入れるよう要求で囲まれたエンティティの新しい下位のリクエストラインにRequest-URIによって識別されるリソースのを

したがって、コレクションに新しいリソースを作成します。

PUT

PUTの同封エンティティはれるメソッド要求格納されている付属のRequest-URIの下。Request-URIが既存のリソースを参照している場合、囲まれたエンティティは、起点サーバーにあるエンティティの変更バージョンと見なされるべきです(SHOULD)。Request-URIが既存のリソースをポイント、そのURIが要求元のユーザーエージェントによって新しいリソースとして定義できる場合、オリジンサーバーはそのURIでリソースを作成できます

したがって、リソースの存在に基づいて作成または更新します。

Reference:




Answer 5 Alexander Torstling


POST は、「ユーザーを作成するための入力です。私のために作成してください」のように、「新規作成」を意味します。

PUT は、「ここにユーザー5のデータがあります」のように、「既に存在する場合は挿入、置換」を意味します。

あなた POST あなたが知らないので、example.com/usersへの URL はまだユーザーのは、サーバーがそれを作成します。

あなたは、 PUT あなたは置き換える/作成したいので、example.com/users/idに特定のユーザーを。

同じデータで2回POSTすると、異なるIDを持つ2人の同一のユーザーが作成されます。同じデータで2回PUTすると、最初にユーザーが作成され、2回目に同じ状態に更新されます(変更なし)。何回実行しても、 PUT 後は同じ状態になるので、毎回「等効性」(べき等)であると言われています。これはリクエストを自動的に再試行するのに役立ちます。ブラウザーの戻るボタンを押しても、「本当に再送してもよろしいですか?」

一般的なアドバイスは、サーバーがリソースの URL 生成を制御する必要がある場合に POST を使用することです。それ以外の場合は PUT を使用します。優先 PUT を 介して POST