有/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
此解决方案存在(至少)两个严重问题:
DELETE
之前停止,则该项目将成为两个组的成员。/group/2
中的商品ID不一样,看起来该商品会失去其身份。如果我想在一个步骤中更改项目的组成员资格(如果可能,保留其身份),我应该如何重新设计API?
答案 0 :(得分: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
如果需要,可以使用POST而不是PUT。
答案 1 :(得分:0)
如果你需要原子操作,我会考虑
POST /group/2?moveFrom=/group/1/item/42