【问题标题】:Removing an item from a collection in a HATEOAS way以 HATEOAS 方式从集合中删除项目
【发布时间】:2018-03-20 21:32:29
【问题描述】:

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

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

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

要从该组中删除一个角色,我可以简单地对特定角色执行 DELETE。 (因为每个角色都必须在一个组中,并且不允许将角色移动到另一个组)。
所以我会在角色中添加一个带有 rel“drop”的链接。因此,客户端知道如果或者更确切地说何时允许删除请求:

{
  "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 的用户。

那么我应该把“从角色中删除用户”链接放在哪里?

提前谢谢你:)

【问题讨论】:

    标签: json rest hateoas hal


    【解决方案1】:

    Links 通常包含三个部分

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

    通常情况下,上下文标识符是由... umm... context 隐含的,而不是显式的。

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

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

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

    • 有一个链接链,该链接指向该角色中的用户的表示,并在链接列表中包含放置角色链接关系
    • 用户的表示嵌入到其他表示中,并在该嵌入资源中包含放置角色链接。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-17
      • 2013-01-17
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多