REST API可以至少以两种方式拥有参数:
作为url路径的一部分(即/api/resource/parametervalue)
作为查询参数(例如/api/resource?=参数值)
这里的最佳实践是什么?什么时候使用1,什么时候使用2,有什么一般的指导方针吗?
真实世界的例子:Twitter使用查询参数来指定间隔。(http://api.twitter.com/1/statuses/home_timeline.json?since_id=12345&max_id=54321)
把这些参数放在URL路径中会被认为是更好的设计吗?
这是个很有趣的问题。
你可以同时使用它们,关于这个主题没有任何严格的规则,但是使用URI路径变量有一些优点:
缓存:
大多数互联网上的web缓存服务不缓存GET请求时,他们包含查询参数。
他们这样做是因为有很多RPC系统使用GET请求来更改服务器中的数据(失败!!)Get必须是一个安全的方法)
但是如果使用路径变量,所有这些服务都可以缓存GET请求。
层次结构:
路径变量可以表示层次结构:
/城市/街道/的地方
它为用户提供了关于数据结构的更多信息。
但如果你的数据没有任何层次关系,你仍然可以使用Path变量,使用逗号或分号:
/城市/经度,纬度
作为规则,当参数的顺序重要时使用逗号,当顺序不重要时使用分号:
/ IconGenerator /红色,蓝色,绿色
除了这些原因之外,在某些情况下,使用查询字符串变量是非常常见的:
当您需要浏览器自动将HTML表单变量放入URI时
当你处理算法的时候。例如谷歌引擎使用查询字符串:
http:// www.google.com/search ? q =休息
总而言之,没有任何强烈的理由使用这种方法,但只要可以,就使用URI变量。
如果有记录在案的最佳实践,我还没有找到它们。然而,当我决定在url中放置参数时,这里有一些指导原则:
可选参数往往更容易放在查询字符串中。
如果您希望在参数值与现有资源不对应时返回404错误,那么我倾向于使用路径段参数。例如:/customer/232,其中232不是有效的客户id。
然而,如果你想返回一个空列表,那么当参数没有找到时,我建议使用查询字符串参数。例如/联系人吗?name =戴夫
如果一个参数影响URI空间的整个子树,则使用路径段。例如,语言参数/en/document/foo.txt和/document/foo.txt?语言= en
我希望唯一标识符位于路径段中,而不是查询参数中。
uri的官方规则可以在这个RFC规范中找到。这里还有另一个非常有用的RFC规范,它定义了参数化uri的规则。