1

とがあり/group/1、のメンバーです。から削除して に入れたいと思います。私の現在の解決策はこれです:/group/2/item/42/group/1/item/42/group/1/group/2

GET    /group/1/item/42   => Get the item from the first group
POST   /group/2/item      => Create a clone of the item in the 2nd group
DELETE /group/1/item/42   => Delete the original item from the 1st group

このソリューションには (少なくとも) 2 つの深刻な問題があります。

  1. クライアントが の前に停止するDELETEと、アイテムは両方のグループのメンバーになります。
  2. アイテムの ID は で同じではありません/group/2。これは、アイテムがその ID を失うかのように見えます。

アイテムのグループ メンバーシップを 1 ステップで (可能であれば ID を保持して) 変更したい場合、API を再設計するにはどうすればよいですか?

4

2 に答える 2

1

あなたの場合、URI を使用してアイテムをグループにリンクしません。

グループへの項目が 1 対 n の関係である場合、すべての項目はそのグループへのリンク (データベースの外部キーなど) を持つ必要があります。

したがって、URI 空間ははるかに単純になる可能性があります。

./[groups|items]/{id}

RESTful な方法は、アイテム リソースを POST で変更することです。

POST /items/42 { group: 2 }

この場合、バックエンドはリクエストを既存のリソースの更新として識別します。

API がどのように機能するかを示すいくつかのデモを次に示します。

GET /items --list of all items by IDs
GET /groups --list of all groups by IDs
GET /items/42 --item 42 properties

POST /items { id: 33, name: "Cool Item", group: 2} -- adds a new item, linked to group 2
PUT /groups/4 { id: 4, name: "Hot group"} --adds a new group
POST /groups/4 {name: "Cool group" } --updates the name of group 4
POST /items/33 { group: 4 } --moves the new item 33 to group 4

GET /items?group=4 --list of all items belonging to group 4

必要に応じて、PUT の代わりに POST を使用できます。

于 2013-09-15T18:08:31.730 に答える
0

アトミック操作が必要な場合は、検討します

POST /group/2?moveFrom=/group/1/item/42
于 2013-09-13T13:03:45.957 に答える