1. ホーム
  2. rest

[解決済み] リソースが既に存在する場合の POST に対する HTTP レスポンスコード

2022-03-20 17:26:28

質問

クライアントがオブジェクトを保存できるサーバーを構築しています。 これらのオブジェクトは、クライアント側で完全に構築され、オブジェクトの全寿命期間にわたって永久的なオブジェクトIDを備えています。

クライアントがPUTを使ってオブジェクトを作成または変更できるように、APIを定義しました。

PUT /objects/{id} HTTP/1.1
...

{json representation of the object}

id}はオブジェクトIDなので、Request-URIの一部となります。

今、クライアントがPOSTを使ってオブジェクトを作成できるようにすることも考えています。

POST /objects/ HTTP/1.1
...

{json representation of the object, including ID}

POST は "append" 操作として意味されるので、オブジェクトがすでに存在する場合にどうすればよいのかわかりません。 このリクエストを修正リクエストとして扱うべきなのか、それとも何らかのエラーコードを返すべきなのか(どの)?

どのように解決するのですか?

私が感じたことは 409 Conflict が最も適切だと思いますが、もちろん、野生ではめったに見られません。

<ブロッククオート

リソースの現在の状態との衝突のため、リクエストを完了できませんでした。このコードは、ユーザーが競合を解決してリクエストを再送信できるかもしれないと予想される状況においてのみ許可されます。応答ボディは、ユーザーがコンフリクトの原因を認識するために十分な情 報を含むべきである[SHOULD]。理想的には、応答ボディはユーザーまたはユーザーエージェントが問題を解決 するのに十分な情報を含むだろう。しかし、それは可能ではないかもしれず、必須では ない。

競合は、PUTリクエストに対する応答で発生する可能性が最も高い。例えば、バージョン管理が使用され、PUTされるエンティティが、以前の(サードパーティの)リクエストによってなされたものと衝突するリソースへの変更を含んでいた場合、サーバーはリクエストを完了できないことを示すために409応答を使用するかもしれない。この場合、応答エンティティは、おそらく応答のContent-Typeで定義される書式で、2つのバージョン間の差分のリストを含むだろう。