【问题标题】:How to map resource A to resource B via REST call?如何通过 REST 调用将资源 A 映射到资源 B?
【发布时间】:2018-03-15 15:32:21
【问题描述】:

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

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

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

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

在我看来,两者实际上都不太正确......

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

【问题讨论】:

    标签: rest post put


    【解决方案1】:

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

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

    POST动词,如你所说,一般用于创建新对象。

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

    【讨论】:

    • 这意味着我需要先创建一个GET /users/1/roles,这样我才能再次将一个特定角色添加到PUT /users/1/roles 的列表中。我不知道这个。
    • 是的。这是一般模式。
    • 我也将拥有与RolesPermissions. 相同的星座 整个系统将拥有不同的服务,这些服务将定义自己的权限。随着系统的增长,可能会发生一个角色可能拥有超过 100 个权限的情况。如果我现在想添加权限,这似乎是很多必要的数据传输。好像真的不好卖。
    • 我只是有了另一个想法:使用PUT /users/1/roles 时,我总是需要提供完整的列表。如果我使用POST/ users/1/roles,我只能提供一个将被添加到资源中的部分列表,对吗? POST 应该是正确的,因为我会为此用户创建一个“新资源”
    • 是的,这是有道理的。
    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多