【问题标题】:REST URI Design for resources that belong to a specific user属于特定用户的资源的 REST URI 设计
【发布时间】:2021-02-28 00:37:08
【问题描述】:

假设我想创建一个非常简单的 todolist RESTful API,每个用户都拥有一个 todo 列表。用户已通过 http BASIC 或 DIGEST 进行身份验证。

此时我不确定 URL 方案应该是什么样子。 会不会:

http://servername/todos/

我的服务器根据 http 标头给我的身份验证过滤适当的待办事项。

或者我应该在 URI 中包含用户名:

http://servername/users/username/todos/

在一些网站上,我什至看到他们将用户名作为参数交出,如下所示:

http://servername/todos?username=babsi

据我所知,所有三个选项都是无状态的,因为我总是收到用户名,但只是来自不同的来源。据我所知,为了确保正确的用户可以访问 URI,无论如何我总是需要检查 http 标头。那么您认为哪种方式是 REST 中最好的 URI 设计,或者我应该完全采用不同的方式?

【问题讨论】:

  • 我会使用你的第一个选项 http://servername/todos/http://servername/me/todos/

标签: rest


【解决方案1】:

您可以使用以下内容:

http://servername/todos/ GET list all todos
http://servername/users/ GET list all users
http://servername/users/{user_id}/ GET list an user
http://servername/users/{user_id}/todos/ GET list all todos for an user   

我认为这里的重点是您希望如何设计资源之间的关系,如果待办事项可以存在于用户的上下文中,请使用类似于上面的层次结构的方法。 作为一般规则,我通常遵循以下规则:

使用路径变量来编码层次结构:/parent/child

将标点符号放在路径变量中以避免暗示层次结构 不存在:/parent/child1;child2

使用查询变量来暗示算法的输入,例如 示例:/search?q=jellyfish&start=20

【讨论】:

    【解决方案2】:

    在 URL 中包含用户名取决于您在收到 URL 中的用户名与身份验证不匹配的请求时想要做什么(如果有的话)。如果您想在这种情况下重新授权用户,那么可以 - 在 URL 中包含用户名是可以的,否则如果不需要,可以将其仅包含在您的标头或其他身份验证方案中。

    一个相当常见的有效要求示例是,如果您必须有一个可以模拟其他用户的主要用户(或此类用户组)。

    【讨论】:

      【解决方案3】:

      当相关用户始终是持有身份验证令牌的用户时,请在路径中使用“我”之类的内容。

      http://example.com/users/me/<path-to-inner-resource>
      

      否则,应该像对待系统中的任何其他资源一样对待用户,在这种情况下,该用户的资源标识符将成为路径的一部分。

      http://example.com/users/<id>/<path-to-inner-resource>
      

      以 Twitter API 为例。 https://developer.twitter.com/en/docs/twitter-api/users/follows/quick-start/follows-lookup

      【讨论】:

        猜你喜欢
        • 2011-05-03
        • 1970-01-01
        • 2020-10-19
        • 1970-01-01
        • 1970-01-01
        • 2015-08-28
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多