ペイロードにリソースIDを含めるか、URIから派生するには


13

APIを設計する際に、PUTペイロードに更新対象のリソースのIDを含める必要があるかどうかという疑問に思いつきました。

これは私たちが現在持っているものです:

PUT /users/123 Payload: {name: "Adrian"}

ルートコードはURIからIDを抽出し、更新を続行します。

APIの最初のユーザーは、ペイロードにIDを許可しない理由を疑問視しています。

PUT /users/123 Payload: {id: 123, name: "Adrian"}

許可しなかった理由は、ペイロードとURIでIDが重複しているためです。

これについてもう少し考えて、リソースをURIに結合しています。

URIにIDがない場合、ペイロードを修正する必要があります。

PUT /no/id/here Payload: {name: "Adrian"} < What user???

しない理由はありますか?

回答:


14

あなたがされているはずのカップル統一へのリソースに識別子リソース

RESTがHTTPで実装されている場合、GETを使用してリソースの現在の値を取得し、PUTを使用して新しい値を設定します。GETにはペイロードがないため、リソースはURIで識別する必要があります。そして、PUTは同じURIに対して論理的に行われ、ペイロードは次のGETが返すものとまったく同じに見えるはずです。

異なるURIに対してPOSTを使用できますが、GETに対して不必要に非対称であるため、あまり意味がありません。共通URIへのPOSTは、新しいリソース(POST /users/new、ペイロード:{name: "Adrian"}、応答{id: 345, name: "Adrian"})を作成する場合にのみ意味があります、それi等ではないため、避ける必要があります あなたがRESTを目指しているなら¹。代わりに、1回の呼び出しでIDを予約し、PUTを使用して新しいIDを設定する必要があります。これはフォールトトレラントです。最初の要求が失敗した場合、ID予約は最終的にタイムアウトになる可能PUT性があり、the 等であるためです。または、クライアントが生成したUUIDを使用します。


¹RESTの定義は、べき等については何も言及していないため、非べき等の操作がある場合、それがRESTであると実際に主張することはできません。それは、dem等の要求に固執することで、それらを複雑にすることなく物事をより信頼できるものにするという事実を変更しないため、推奨されます。


3
私の知る限り、POSTリクエストはべき等である必要はありません。だから、投稿に問題はありません/users(「新規」を追加する必要はありません)。
lex82

お返事をありがとうございます。すべてのリクエストに対してべき等性を持つのは素晴らしい機能ですが、REST APIにこれが必要だと言うのは誰ですか?当然、RESTfulと呼ばれる多くのAPIは、ide等でないPOST要求を許可します(特に、サーバーが新しいリソースのIDを生成する場合)。しかし、RESTの非常に厳密な定義を適用しても、上記の例のような非べき等のPOSTでどのアーキテクチャ上の制約に違反しているかはわかりません。
lex82

制約に違反するPOSTリクエストを確実にイメージできます。リソースをコレクションにポストし、サーバーにそのIDを決定させることがREST制約違反である理由がわかりません。
lex82


3
POSTの全体的なアイデアは、べき等になることではありません
。...-EralpB

2

これについてもう少し考えて、リソースをURIに結合しています。

URIにIDがない場合、ペイロードを修正する必要があります。

PUT / no / id / hereペイロード:{名前: "エイドリアン"} <どのユーザー???

しない理由はありますか?

この質問に対する答えは、クライアントがIDを変更できるようにするかどうかによって異なりますか?

クライアントがPUTを介してIDを変更できる場合、リソースのURIが変更されるため、リソースが古いURIにアクセスするたびに301 Moved Permanentlyを指定する必要があります。

たとえば、次のリソースから開始します

/users/123

そして、クライアントはリソースに以下をPUTします

{id: 222, name: "Adrian"}

リソースが更新され、そのURIは現在

/users/222

LocationPUT応答のフィールドには新しいURIが含まれている必要があります。アクセスすると、Locationフィールドが新しいリソースを指して/users/123いる301応答が返されます/users/222

ただし、ほとんどの場合、実際にクライアントがIDを変更できるようにすることは望ましくありません。この場合、IDはサーバーのみが変更できるものであり、クライアントはこの状態を更新できないため、PUT本体から除外する必要があります。

同じリソース上の異なるURIにrequireをPUTする場合、たとえば

/users/adian_lync

そのリソースが存在しない場合、サーバーはそれを作成し、実行中にIDを作成する必要があります


1
ペイロード内のIDの配置に疑問を呈する理由は、Backbone.jsがデフォルトでPUT要求でIDを渡すためです。それを止めることはできますが、なぜそれがデフォルトの動作なのかを知りたいのです。
エイドリアンリンチ14年

1
私はBackbone.jsに慣れていないのではないかと心配しています。IDがURLにも含まれている場合は不要と思われます。おそらく開発者側の見落とし
Cormac Mulhall 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.