1. ホーム
  2. http

[解決済み】HTTPのPOSTとPUTの違いは何ですか?

2022-03-17 23:17:11

質問

によると rfc 2616, § 9.5 , POST が使われているのは 作成 リソースを作成します。

POSTメソッドは、リクエストに含まれるエンティティを、Request-LineのRequest-URIで特定されるリソースの新しい下位としてオリジンサーバーに受け入れるよう要求するために使用されます。

によると rfc 2616, § 9.6 , PUT が使われているのは 作成または置換 リソースを指定します。

PUTメソッドは、指定されたRequest-URIの下に同封のエンティティを格納するよう要求します。Request-URIが既に存在するリソースを参照する場合、同封のエンティティは、オリジン サーバーに存在するものの修正版とみなされるべきである[SHOULD]。Request-URIが既存のリソースを指しておらず、そのURIがリクエストする ユーザーエージェントによって新しいリソースとして定義できる場合、オリジン サーバーはそのURIを持つリソースを生成できる。

では、リソースの作成にはどちらのHTTPメソッドを使用すればよいのでしょうか?それとも両方がサポートされるべきなのでしょうか?

解決方法は?

全体的に。

作成にはPUTとPOSTの両方が使用可能です。

何を使うべきかを見分けるには、「何に対してアクションを行うのか?例えば、質問をするためのAPIを設計しているとしましょう。 もしPOSTを使いたいのであれば、質問のリストに対してそれを行うでしょう。PUTを使いたいのであれば、特定の質問に対して行うでしょう。

では、RESTfulデザインではどちらを使えばいいのでしょうか。

PUTとPOSTの両方に対応する必要はありません。

どちらを使うかはあなた次第です。 しかし、リクエストの中でどのオブジェクトを参照するかによって、正しい方を使うことだけは忘れないでください。

いくつか考慮すべき点があります。

  • 作成したURLオブジェクトに明示的に名前を付けるのか、それともサーバーに判断させるのか?もし名前を付けるのであれば、PUTを使用します。 サーバーが決定する場合は、POSTを使用します。
  • PUTはidempotencyを仮定して定義されているので、オブジェクトを2回PUTしても、それ以上の効果はないはずです。 これは素晴らしい特性なので、私は可能な限りPUTを使用します。ただ、PUT-idempotencyが実際にサーバーで正しく実装されていることを確認してください。
  • 同じオブジェクトのURLで、PUTでリソースを更新または作成することができます。
  • POST では、URL を変更する 2 つのリクエストを同時に受信することができ、それらはオブジェクトの異なる部分を更新することができます。

一例です。

の一部として、次のように書きました。 この件に関しては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> は存在しません。 はまだです。 をPUTする必要があります。 <new_question> リソースをサーバーにインストールします。

しかし、次のようにすることもできます。 を使用して、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

PUT メソッドは、対象リソースの状態を要求する。 created または replaced という表現で定義された状態 をリクエストメッセージペイロードで囲む。