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

时间:2018-03-20 08:02:15

标签: json rest hateoas hal

我正在开发一个项目,其客户端使用REST / HATEOAS来获取和修改数据 以下是类图的一部分:class diagram

请求 / group / 12345 的hal + json HATEOAS响应如下所示:

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

要从该组中删除角色,我只需对特定角色执行DELETE即可。 (因为每个角色必须只在一个组中,并且不允许将角色移动到另一个组)。
所以我会添加一个链接与rel" drop"这个角色。因此,当允许DELETE请求时,客户端知道 if 或更确切地说

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

因此,要删除用户,客户端会查找丢弃链接。如果未找到链接,则不允许删除。否则,它会在找到的链接上执行DELETE请求。

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

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

那么我应该把"删除用户放在角色"链路?

提前谢谢你:)

1 个答案:

答案 0 :(得分:1)

Links通常有三个部分

  • 上下文标识符
  • 链接关系类型
  • 目标标识符

上下文标识符通常由...... umm ... context 隐含,而不是明确的。

从我可以看到,hal+json没有明确指定上下文标识符的机制,这意味着你需要依赖隐式方法。

这表明,如果您想要就角色中的用户进行沟通,那么您需要一个暗示正确标识符的上下文。

您通常会采用以下两种方式之一

  • 有一系列链接,可以表示该角色中的用户,并在链接列表中包含drop role链接关系
  • 以其他方式嵌入用户的表示形式,并在该嵌入式资源中包含drop role链接。

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

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

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