背景情報分析:
によるとRFC 2616、§9.5はリソースを作成するPOST
ために使用されます:
POST メソッドは、リクエストに含まれるエンティティを、リクエスト ラインの Request-URI によって識別されるリソースの新しい従属エンティティとして受け入れるようにオリジン サーバーに要求するために使用されます。
によるとRFC 2616、§9.6は、リソースを作成または置換するPUT
ために使用されます。
PUT メソッドは、指定された Request-URI で囲まれたエンティティを保存することを要求します。Request-URI が既存のリソースを参照する場合、囲まれたエンティティは、オリジン サーバーに存在するエンティティの修正バージョンとして考慮される必要があります。Request-URI が既存のリソースを指しておらず、その URI が要求元のユーザー エージェントによって新しいリソースとして定義できる場合、オリジン サーバーはその URI を使用してリソースを作成できます。
私の質問:
では、リソースを作成するにはどの HTTP メソッドを使用する必要がありますか? または、両方をサポートする必要がありますか?
ベストアンサー1
全体:
作成には PUT と POST の両方を使用できます。
何を使用すべきかを区別するには、「何に対してアクションを実行するのか」を自問する必要があります。質問をするための API を設計していると仮定します。POST を使用する場合は、質問のリストに対してそれを実行します。PUT を使用する場合は、特定の質問に対してそれを実行します。
どちらも使用できますが、RESTful 設計ではどちらを使用すればよいでしょうか。
PUT と POST の両方をサポートする必要はありません。
どちらを使用するかはあなた次第です。ただし、リクエストで参照しているオブジェクトに応じて適切なものを使用することを忘れないでください。
考慮すべき点:
- 作成する URL オブジェクトに明示的に名前を付けますか、それともサーバーに決めさせますか? 名前を付ける場合は PUT を使用します。サーバーに決めさせる場合は POST を使用します。
- PUT はべき等性を前提として定義されているため、オブジェクトを 2 回 PUT しても、追加の効果はありません。これは優れた特性なので、可能な場合は PUT を使用します。ただし、PUT のべき等性が実際にサーバーに正しく実装されていることを確認してください。
- 同じオブジェクトURLでPUTを使用してリソースを更新または作成できます。
- POST を使用すると、2 つのリクエストが同時に送信され、URL が変更され、オブジェクトの異なる部分が更新される可能性があります。
例:
私は以下をこれに関するSOの別の回答:
役職:
リソースの変更と更新に使用します
POST /questions/<existing_question> HTTP/1.1 Host: www.example.com/
以下はエラーであることに注意してください。
POST /questions/<new_question> HTTP/1.1 Host: www.example.com/
URL がまだ作成されていない場合は、名前を指定するときに POST を使用して URL を作成しないでください。まだ存在しないため、「リソースが見つかりません」というエラーが発生します。まず、サーバーにリソース
<new_question>
を配置する必要があります。<new_question>
ただし、POST を使用してリソースを作成するには、次のようにすることができます。
POST /questions HTTP/1.1 Host: www.example.com/
この場合、リソース名が指定されていないため、新しいオブジェクトの URL パスが返されることに注意してください。
置く:
リソースを作成または上書きするために使用されます。リソースの新しい 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