【问题标题】:REST API, path variable vs request paramREST API,路径变量与请求参数
【发布时间】:2012-04-11 05:28:04
【问题描述】:

我目前正在编写一个提供对某些资源的访问的 Web 服务。我尝试遵循 REST,但我的 API 的某些部分遇到了问题。

我有以下 uri:

  • /myservice/users/ :获取所有用户
  • /myservice/users/{userId} :获取特定用户
  • /myservice/badges/ :获取所有徽章
  • /myservice/badges/{badgeId} :获取特定徽章

现在,我的问题是,我必须实施一种方法来获取所有拥有特定徽章的用户。 我可以认为这只是我在用户列表中应用的过滤器,因此是以下 uri:

  • /myservice/users/?filter=badge:{badgeId}

或者我可以认为这只是徽章的子资源,因此以下 uri:

  • /myservice/badges/{badgeId}/users/

哪一个看起来必须“符合 REST 标准”?

我必须说我已经阅读了一些关于这个主题的帖子,特别是这个:Rest Standard: Path parameters or Request parameters,但它们似乎没有涵盖我的问题。

【问题讨论】:

  • REST 对您的 URI 的外观没有意见。任何一个都与“REST 兼容”一样
  • 仅供参考,我对您提到的问题进行了拍摄,您可能对answer 感兴趣。

标签: rest


【解决方案1】:

如果您希望实现 RESTful,请考虑使用 HATEOAS(可怕的首字母缩写词,但成为真正 RESTful 的关键)。

使用 HATEOAS,您的徽章表示可能如下所示:

<badge>
  <id>1234</id>
  <name>Admin</name>
  <link rel = "/rel/users"
        href = "/myservice/users?badge=1234" />
  <link rel = "self"
        href = "/myservice/badges/1234" />
</badge>

这允许您的客户端从您的服务器的 URI 方案中解耦,因为它们只是在 /rel/users 链接提供的任何 href 上获取。当然,您的服务器仍然需要在内部定义一个 URI 方案,但是如果在某个时候您决定不关心它,您可以轻松地更改它而不会破坏您的客户端。例如,您可能希望将 URI 方案更改为您的第二个选项,这会导致您的徽章表示更改为:

<badge>
  <id>1234</id>
  <name>Admin</name>
  <link rel = "/rel/users"
        href = "/myservice/badges/1234/users" />
  <link rel = "self"
        href = "/myservice/badges/1234" />
</badge>

使用 /rel/users 链接关系的客户端不受 URI 更改的影响。这归结为...使用 HATEOS,URI 方案并不那么重要

干杯!

【讨论】:

    【解决方案2】:

    我更喜欢/myservice/users/?filter=badge:{badgeId},而且我认为更多的 API 使用这种格式。

    【讨论】:

      【解决方案3】:

      我强烈建议使用查询字符串。

      路径变量绑定不好。 路径变量破坏了 Apache 访问日志分析数据。 没有分析工具支持路径变量。

      如果您的公司使用 APM - 昂贵的 - 工具,路径变量将看到与独立 API 相同的功能。

      休息?好的。但是绑定必须使用查询字符串。

      【讨论】:

        【解决方案4】:

        使用查询字符串,如:

        /myservice/users/?badge=badgeId&genter=male&year__gt=18
        

        这样比较安静。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-22
          • 2023-04-04
          • 1970-01-01
          相关资源
          最近更新 更多