以 HATEOAS 方式从集合中删除项目

Removing an item from a collection in a HATEOAS way

我正在做一个项目,其客户使用 REST/HATEOAS 来获取和修改数据。
这是 class 图的一部分:class diagram.

A hal+json 请求的 HATEOAS 响应 /group/12345 看起来像:

{
  "id": "12345",
  "_links": {
    "self": {
      "href": "/group/12345"
    },
    "roles": {
      "href": "/group/12345/roles"
    }
  }
}

要从此组中删除角色,我可以简单地对特定角色执行 DELETE。 (因为每个角色都必须属于一个组,并且不允许将角色移动到另一个组)。
所以我会在角色中添加一个 link 和 rel "drop"。因此,客户端知道 if 或者 when 允许删除请求:

{
  "id": "67890",
  "_links": {
    "self": {
      "href": "/roles/67890"
    },
    "users": {
      "href": "/roles/67890/users"
    },
    "drop": {
      "href": "/roles/67890"
    }
  }
}

因此,要删除用户,客户端会查找删除 link。如果没有找到link,则不允许删除。否则,它将对找到的 link 执行 DELETE 请求。

但是如果我想从一个角色中删除一个用户,我应该怎么做呢?
我不能简单地删除用户。角色-> 用户关系不是聚合。
如果允许从角色中删除用户,我如何告诉客户?

从角色中删除 用户,我会使用DELETE /groups/12345/roles/67890/users/ABC。要 delete 用户,我会使用 DELETE /users/ABC.

所以我应该把 "remove user from role" link 放在哪里?

提前谢谢你:)

Links通常有三部分

  • 上下文标识符
  • 一个link关系类型
  • 目标标识符

上下文标识符通常由...嗯...上下文隐含,而不是显式显示。

据我所知,hal+json 没有明确指定上下文标识符的机制,这意味着您需要依赖隐式方法。

这表明,如果您想就从角色中删除用户进行交流,那么您需要一个隐含正确标识符的上下文。

您通常会通过以下两种方式之一进行此操作

  • 有一个 link 链,指向该角色中的用户表示,并在 [=46 的列表中包含删除角色 link 关系=]s
  • 嵌入用户在其他一些表示中的表示,并在该嵌入资源中包含放置角色link。

例如,您的 /roles/67890/users 可能类似于

_links: {
    self: {
        href: /roles/67890/users
    }
}

_embedded: {
    users: [ {
        _links: {
            self: /users/ABC
            /role/remove :  /groups/12345/roles/67890/users/ABC
        }
   } ,
   ... ]
}