我目前正在编写一个提供对某些资源的访问的Web服务。我尝试关注REST但是我遇到了关于API的某些部分的问题。
我有下列的uris:
现在,我的问题是,我必须实现一种方法来获取具有特定徽章的所有用户。 我可以认为这只是我在用户列表中应用的过滤器,因此以下是uri:
或者我可以认为这只是徽章的子资源,因此以下是uri:
哪一个似乎必须'符合REST'?
我必须说我已经阅读了有关此主题的一些帖子,特别是这个帖子:Rest Standard: Path parameters or Request parameters但它们似乎并不能解决我的问题。
答案 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
这更加宁静。