クライアント用にサーバーにキーと値のストレージを保持します。ユーザーがキー「k1」を送信した場合、データベースにアップサートします。これはPOST
またはPUT
と見なされますか?
また、既存のすべてのキーを削除して新しいキーを追加する別の操作があります。これは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でもリソースをダウンロードできる必要があります。
この操作は2つのことを行うため、RESTfulと見なすことはできないと思います。データへの単純なアクセスではなく、特定のクライアントのニーズを満たすマクロを提供しているようです。標準のRESTfulデザインは
あまり明確ではありませんが、単一のDELETEリクエストを http://www.somewhere.com/resources に送信して、すべてのリソースを削除することも合法だと思います。
アップサート操作の背後にある考え方は、クライアントがデータ構造に関する情報/決定を持ち、キー値を持つデータを送信することです。したがって、アップサート操作のリクエストモデルは、以下の例のようにキーを含む更新操作に非常に似ています。
/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に送られ、既存のレコードがあるため、このリクエストを更新として処理する必要があります。これは、設計に関するあなたの側で答えられる質問です。
Polly Shawの答えは正しいですが、メッセージが不完全である可能性が高い(リソースがまだ作成されていないときにIDが欠落している)場合、[〜#〜] patch [〜#〜]動詞はもう少し正確です。
https://tools.ietf.org/html/rfc5789
これは非常に細かい調整です。