REST API,路径变量vs请求参数

时间:2012-03-27 16:25:04

标签: rest

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

我有下列的uris:

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

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

  • /为MyService /用户/过滤器=徽章:{badgeId}

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

  • /为MyService /徽章/ {badgeId} /用户/

哪一个似乎必须'符合REST'?

我必须说我已经阅读了有关此主题的一些帖子,特别是这个帖子:Rest Standard: Path parameters or Request parameters但它们似乎并不能解决我的问题。

4 个答案:

答案 0 :(得分:5)

如果您希望使用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方案并不是那么重要

干杯!

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

使用查询字符串,例如:

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

这更加宁静。