【问题标题】:Restful linking of existing resources现有资源的宁静链接
【发布时间】:2015-09-07 21:15:26
【问题描述】:

我不认为我的设置有任何独特之处,但我似乎找不到关于该主题的太多信息。我有一个User 实体。一个用户可以有多个Roles。角色是系统中预定义的实体,客户端无法创建新角色。但是,客户端可以从User 添加或删除Roles。我对如何实现将Role 链接到User 有一些想法,但我不确定哪个是最佳选择。

GET /users/1/roles 返回一个像这样的集合:

[
  {
    "id":1,
    "name": "ACTIVE_USER"
  },
  {
    "id":2,
    "name": "ADMIN"
  }
]

这是我目前考虑过的选项

1。正文中的角色 ID

POST /users/1/roles

{
  "roleId":1
}

2。 url中的角色ID

POST /users/1/roles/1

3。单独的用户角色端点

POST /user-roles

{
    "userId":1,
    "roleId":1
}

4。与GET /roles 相同的格式返回

POST /user/1/roles

{
  "id":1        
}

【问题讨论】:

    标签: api rest restful-url


    【解决方案1】:

    角色是系统中预定义的实体,客户端无法创建新角色

    我建议您不要使用任何选项,因为它们都会发出 POST 请求。

    记住角色是预定义的,您没有创建新角色,因此 POST 请求不合适。

    相反,由于每个用户都有一个角色列表(可能是空列表,也可能不是空列表),我只需执行 PATCH 请求以使用新角色更新该角色列表。记住 PUT 是创建/替换,PATCH 是“更新”

    一种可能的情况是您可以添加和删除用户的角色。所以我建议你在请求正文中添加一个操作参数:

    PATCH /users/1
    
    [
      {"action": "add", "path": "/roles", "roleId": 1}
    ]
    

    为用户添加角色。对于删除,您自然会将add 替换为remove

    如果你好奇{"action": "add", "path": "/roles", "roleId": 1}的用法来自哪里,请查看this page

    【讨论】:

    • 我同意 POST 似乎是错误的,因为它并没有真正创建新资源(尽管它会导致连接表中的新数据库条目)。但是,我认为 PATCH 用于更新特定实体,在您的第一个示例中,您正在修补集合的 url 似乎。向请求正文添加操作确实可以更清楚地说明发生了什么,但我想这样做而不引入 api 用户不知道的额外数据 - 我喜欢客户端可以使用 api 而无需 api 的想法文档。
    • @mickadoo 这样看:您正在更新用户条目,更新恰好涉及更新集合
    • 虽然我可能有错误,我会在早上修改我的答案
    • PATCH 可能是正确的选择。到目前为止,我只使用它来更新特定实体的属性,但是添加关于如何处理 PATCH 请求的说明似乎是作者在this article 中的建议,但当然,想听听你有什么早上说
    • @mickadoo 很好的发现。这基本上就是我想说的,但支持得更好。我相应地编辑了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2011-04-30
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    相关资源
    最近更新 更多