【问题标题】:REST API - Changing group membershipREST API - 更改组成员身份
【发布时间】:2013-09-12 13:09:39
【问题描述】:

/group/1/group/2,而/item/42/group/1 的成员。我想从/group/1 中删除/item/42 并将其放入/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

这个解决方案有(至少)两个严重的问题:

  1. 如果客户端在DELETE 之前停止,则该项目将成为两个组的成员。
  2. /group/2 中的项目 ID 不会相同,这看起来好像项目将失去其身份。

如果我想在一个步骤中更改项目的组成员身份(如果可能,保留其身份),我应该如何重新设计 API?

【问题讨论】:

  • 组和项之间是否存在一对多或多对多的关系?
  • @supertopi 每个项目都是一个组的成员。组可以包含任意数量的项目,甚至为零。

标签: api rest group-membership


【解决方案1】:

在您的情况下,我不会使用 URI 将项目链接到组。

如果项目到组是 1 到 n 关系,则每个项目都应该有一个到其组的链接(例如数据库外键)。

因此,您的 URI 空间可能会更简单:

./[groups|items]/{id}

RESTful方式是通过POST修改item资源。

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。

【讨论】:

  • 谢谢!!!无论如何,AFAIK POST 用于创建新资源,PUT 和 PATCH 用于更新现有资源。 POST 仅在客户端或服务器不处理 PUT 或 PATCH 时用于更新。 jasonsirota.com/rest-partial-updates-use-post-put-or-patch
  • 通过 PUT 创建资源是完全 REST-ful 的。创建资源时使用 PUT 与 POST 更多地取决于客户端是否知道它正在创建的资源的完整 URI。如果客户端知道新资源的完整 URI,它可以(并且应该) PUT 那个资源的内容来创建它。另一方面,如果事先不知道完整的 URI 并且只能由服务器定义,那么典型的模式是 POST 到创建新资源并在位置标头中返回其 URI 的工厂资源。
  • 话虽如此,这里使用的 PUT 示例并不是我认为 REST-ful 的:这些 PUT 到通用 /items 或 /groups 工厂对象而不是 POST。这不是 PUT 的适当幂等使用。
  • @TimDean 你是对的。我修改了一些示例。我提醒你,它们只是我添加的示例,用于演示我建议的 API 的使用 :)
【解决方案2】:

如果你需要原子操作,我会考虑

POST /group/2?moveFrom=/group/1/item/42

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多