Restful 链接现有资源

Restful linking of existing resources

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

GET /users/1/roles returns 像这样的集合:

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

以下是我目前考虑过的选项

1。正文中的 roleId

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 returns

相同

POST /user/1/roles

{
  "id":1        
}

The roles are pre-defined entities in the system and the client cannot create new roles

我会反对你的任何选择,因为他们都做了一个 POST 请求。

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

相反,由于每个用户都有一个角色列表(可能是也可能不是空列表),我会简单地执行 PATCH 请求以使用新角色更新该角色列表。记住 PUT 是 create/replace,PATCH 是 "update"

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

PATCH /users/1

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

为用户添加角色。要删除,您自然会用 remove.

替换 add

如果您想知道 {"action": "add", "path": "/roles", "roleId": 1} 的用法来自何处,请参阅 this page