2012-03-11 12 views
3

私は多くを検索しましたが、自分の条件に関する私の質問に適切な答えが見つかりませんでした。
私はREST APIを構築していますが、境界線のように見えるケースは次のとおりです。

- 私は2つのエンティティ、ユーザーとロールを扱っています。ユーザーには複数の役割を割り当てることができます。
- ロールをユーザーに割り当てるには、ロールが既にデータベースに存在している必要があります。
- ロールをユーザーに割り当てるには、ロールの「コード」、つまり短い文字列が必要です。
-The今使用URIパステンプレートがある:
--Users:はlocalhost:8080/API /ユーザ
--Givenユーザー:はlocalhost:8080/API /ユーザー/ {にuserId}所与の
--rolesユーザー:localhost:8080/api/users/{userId}/roles

特定のユーザーを特定のロールに「リンク」するには、2つのオプションがあります。
- いずれのシナリオでもベストプラクティスとして聞こえるもので、ポストデータを本体に送信します(JSONなど)。
他の1つは、それをuriと空のボディで送信します。たとえば、IDがU001のユーザーをロールR001にリンクするには、本文にデータを送信しないで、次のURIに投稿する必要があります:localhost:8080/api/users/U001/roles/R001

私は最初のオプションを使用しても構わないと思うが、これは一番正しいと思われるが、この特定のケースでは、ほとんど空のボディを送る方が良いとは思わない(なぜなら、 localhost:8080/api/users/U001/roles 'に投稿するか、本文をスキップしてuriを通してlocalhost:8080/api/users/U001のようなパスパラメータとしてURLを送信するだけです。/roles/R001
HTTP POSTにURIパス変数を使用する方法はありますか?

ありがとうございました。

答えて

3

URIにロールを入れても何も問題はありません。あなたの直感は正しかったです。私はこのようにしたいと思います。

PUT:locahost:8080/API /ユーザー/ {ユーザID} /役割/ {} roleId

そして、ここでは理由です。

FIRST:PUT動詞はIdempotentです。言い換えれば(仕様からまっすぐに取られた)

... N> 0の同じ要求の副作用は、単一の要求の場合と同じです。

これは私があなたがこの点で欲しいと思うものです。ユーザーの各インスタンスについて複数のレコードを状態記憶域に入れたくない場合&ロール。ユーザは、システムに悪影響を及ぼすことなく(重複レコードを追加して)、同じPUT要求を容易に行うことができるはずです。

POSTで同じことをするときは、すべてのリクエストに対して新しいレコードを作成することが期待されます。

SECOND:PUT動詞は、特定のリソースを特定することになっています。

を(スペックからまっすぐに取ら)... PUTリクエストはリクエストで囲まれたエンティティを識別する - ユーザエージェントは、URIが意図されているものを知っていると、サーバは、いくつかの他のリソースへの要求を適用することを試みてはいけません。サーバが要求を別のURIに適用することを望む場合、 は301(Moved Permanently)応答を送信しなければならない(MUST)。ユーザエージェントは要求をリダイレクトするかどうかに関する独自の決定を行うかもしれません(MAY)。

ロールR102が廃止され、R104が優先されるとどうなりますか? HEADER(Location:localhost:8080/api/users/{userid}/role/R104)を使用して301(Permanently Moved)を返します。

最後に:すべて正常に機能している場合。作成された201(作成済み)と、同じURIへの後続の要求ごとに200(No Content)を返します。彼らがシステムにない役割を提供する場合は、501(実装されていない)を返します。

0

Hmm - この場合、302のPOSTはちょっと混乱するかもしれません。

本当にURIが示唆されているにもかかわらず、非常にシンプルな「PUT」/「DELETE」はありませんか?

シンプルで20Xの意味が成功しました。おそらく30Xがすでに存在していたことを示しています。

関連する問題