如何通过REST调用将资源A映射到资源B?

时间:2017-10-04 09:29:18

标签: rest post put

我有2个与Many-To-Many相关的资源。 一种资源是users,另一种资源是rolesuser可以分配不同的roles,而role可以分配不同的users

  • /users将返回所有用户
  • /roles将返回所有角色

Many-To-Many关系允许我使用以下资源路径:

  • /users/1/roles将返回分配给ID为<1 li>的用户的所有角色
  • /roles/1/users将返回分配给ID为1的角色的所有用户

现在让我们说我想将id为2的角色分配给ID为1的用户。

我有两个不同的想法:

  • PUT /users/1/roles/2 (No request body, as no use)。这种方法非常易读且明显是幂等的。我也不期待回应。但是发送一个带有PUT请求的请求体似乎很奇怪。

  • POST /users/1/roles (Role object as request body)这种方法在技术上似乎更正确。但是我想要映射已经存在的角色并不明显。似乎我为这个用户创建了一个角色。将现有角色附加到请求似乎也没用。 BadRequest,因为我尝试添加一个不存在的角色,会非常混乱。

对我而言,两者似乎都不正确......

这是如何以可理解的REST一致方式完成的?

1 个答案:

答案 0 :(得分:0)

我将使用PUT动词,因为您要更新分配给用户的角色。 但我更喜欢使用请求体来指定我想要分配给这些用户的完整角色列表。

PUT /users/1/roles (list of assigned Role objects as request body)
正如你所说,

POST动词通常用于创建新对象。

另外,以下是我认为有用的同事的其他建议:RESTful APIs from Scratch: Lessons Learnt (so far)