web-dev-qa-db-ja.com

In REST is POSTまたはPUTがアップサート操作に最​​適ですか?

クライアント用にサーバーにキーと値のストレージを保持します。ユーザーがキー「k1」を送信した場合、データベースにアップサートします。これはPOSTまたはPUTと見なされますか?

また、既存のすべてのキーを削除して新しいキーを追加する別の操作があります。これはPOSTまたはPUTです。これは、レコードをクリアして新しいレコードを追加するためです。

47
Jimmy

ユーザーがキー「k1」を送信すると、データベースにアップサートします。これはPOSTまたはPUT。

HTTP仕様 によると:

PUTメソッドは、指定されたRequest-URIで囲まれたエンティティを保存することを要求します。 Request-URIが既存のリソースを参照している場合、囲まれたエンティティは、Originサーバーに存在するエンティティの修正バージョンと見なされる必要があります。 Request-URIが既存のリソースを指しておらず、そのURIが要求ユーザーエージェントによって新しいリソースとして定義できる場合、OriginサーバーはそのURIでリソースを作成できます。

したがって、挿入または更新にPUTを使用することは、どちらの場合でもURIが事前にわかっているという条件で、完全に合法であると思います。 URIの一部としてキーを使用している場合( http://www.somewhere.com/resources/k1 のk1として)、これが当てはまります。ただし、理想的にはRESTfulであるためには、同じURLへのGETでもリソースをダウンロードできる必要があります。

また、既存のすべてのキーを削除して新しいキーを追加する別の操作があります。これはPOSTまたはPUTです。レコードをクリアして新しいキーを追加するためです。

この操作は2つのことを行うため、RESTfulと見なすことはできないと思います。データへの単純なアクセスではなく、特定のクライアントのニーズを満たすマクロを提供しているようです。標準のRESTfulデザインは

  1. 親URLにGETを送信してキーのリストを取得します。上記の例では、 http://www.somewhere.com/resources ;
  2. DELETEを http://www.somewhere.com/resources/k1 ;に送信して、これらの各キーを削除します。
  3. http://www.somewhere.com/resources/k2 にPUTを送信して、置換を追加します。

あまり明確ではありませんが、単一のDELETEリクエストを http://www.somewhere.com/resources に送信して、すべてのリソースを削除することも合法だと思います。

61
Polly Shaw

アップサート操作の背後にある考え方は、クライアントがデータ構造に関する情報/決定を持ち、キー値を持つデータを送信することです。したがって、アップサート操作のリクエストモデルは、以下の例のようにキーを含む更新操作に非常に似ています。

/customers/jimmy

既存のレコードを更新するための予想される方法はPUTです。したがって、選択はPUTである必要があります。

通常、POSTは、次の例のように、新しいコンテンツを含む新しいレコードを挿入するために使用されます。

POST /customers HTTP/1.1
Content-Type: ...
Content-Length: ...
Host: server.yourdomain.com
Accept: ...
User-Agent: ...

id      jimmy
name    jimmy
Occupation   Stackoverflower

したがって、あなたの場合、POST操作は必要ありません。upsert操作のPUTもそれをカバーするためです。

ここで、アップサートに関する重要な質問は、クライアントがアップサート操作についてどの程度信頼するかです。クライアントが既存のキーを持つ新しいレコードを挿入したい場合はどうなりますか?あなたの場合、挿入リクエストと更新リクエストの両方が同じAPIに送られ、既存のレコードがあるため、このリクエストを更新として処理する必要があります。これは、設計に関するあなたの側で答えられる質問です。

1
Tahsin Turkoz

Polly Shawの答えは正しいですが、メッセージが不完全である可能性が高い(リソースがまだ作成されていないときにIDが欠落している)場合、[〜#〜] patch [〜#〜]動詞はもう少し正確です。

https://tools.ietf.org/html/rfc5789

これは非常に細かい調整です。

0
ecoologic