我有2个与Many-To-Many
相关的资源。
一种资源是users
,另一种资源是roles
。 user
可以分配不同的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一致方式完成的?
答案 0 :(得分:0)
我将使用PUT
动词,因为您要更新分配给用户的角色。
但我更喜欢使用请求体来指定我想要分配给这些用户的完整角色列表。
PUT /users/1/roles (list of assigned Role objects as request body)
正如你所说, POST
动词通常用于创建新对象。
另外,以下是我认为有用的同事的其他建议:RESTful APIs from Scratch: Lessons Learnt (so far)