2017-10-04 54 views
1

我有2个资源是Many-To-Many有关。 一种资源是users,另一种是roles。 A user可以指定不同的roles,而role可以指定不同的users如何通过REST调用将资源A映射到资源B?

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

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

  • /users/1/roles将返回分配给所有的角色id为1的用户1
  • /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)这种方法在技术上似乎更正确。但是我想要映射一个已经存在的角色并不明显。我似乎更多的是为这个用户创建角色。将一个已经存在的角色附加到请求上似乎也是无用的。 A BadRequest,因为我尝试添加一个不存在的角色,会很混乱。

双方似乎确实没有真正正确的,我...

这是如何在理解REST做符合呢?

回答

0

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

PUT /users/1/roles (list of assigned Role objects as request body) 

POST动词,正如您所说,通常用于创建新对象。

而且,这里有更多的我从中找到有用的同事建议:RESTful APIs from Scratch: Lessons Learnt (so far)

+0

这意味着,我需要做一个'GET /用户/ 1/roles'第一,所以我可以添加一个特定的角色列表再次输入'PUT/users/1/roles'。我不知道这件事。 –

+0

是的。这是一般模式。 –

+0

我也将拥有与'角色'和'权限'相同的星座。整个系统将有不同的服务来定义他们自己的权限。随着系统的发展,可能会发生一个角色可能拥有超过100个权限。如果我现在想要添加权限,这似乎是很多必要的数据传输。它似乎不是可销售的。 –