在REST Web服务中使用查询字符串

11 rest web-services query-parameters path-parameter

我认为使用REST Web服务的一个主要特征和原因是使用路径参数而不是查询参数.但是许多公开可用的REST Web服务使用查询参数.

我认为查询参数不应该在REST Web服务中使用我错了吗?是否有关于不在REST Web服务中使用查询参数的建议或规则?

Hug*_*ois 27

查询字符串仍然可以在REST Web服务中使用,但与正常情况不同.

您必须将URL视为资源的关键.URL是资源的唯一标识符.例如

http://example.com/products/123   -- where 123 is the id of the products.
Run Code Online (Sandbox Code Playgroud)

访问/products将返回完整的产品列表.添加id将返回特定产品.


每个过滤器使用斜杠的问题

如果您想以特定方式订购产品怎么办?有人会说

http://example.com/products/united-states
Run Code Online (Sandbox Code Playgroud)

嗯,现在第一眼看上去有些含糊不清.美国是个身份吗?那个歧义可以通过说id表示为来解决\d+.正确.

好的,我们的第一个由单词组成的参数是一个国家.

现在假设我们要添加更多过滤器,让我们尝试添加更多斜杠.

http://example.com/products/united-states/home/asc
Run Code Online (Sandbox Code Playgroud)

但我不想只有美国产品!但还是想要家居产品.

http://example.com/products/home/asc
Run Code Online (Sandbox Code Playgroud)

等等......在一个国家?我现在不确定,它有点含糊......如果我想明天添加另一个过滤器怎么办?我该怎么做...添加更多斜杠?

URL变得杂乱,并且充满了模糊的参数,这些参数最初是可选的,并且由于含糊不清而成为强制性的.


我的建议

对我来说,正确的方法是将查询字符串用于特定于查询的事物.因为,我可以以任何我想要的方式对查询进行排序,它仍然是相同的查询.我查询产品.

所以表格应该是这样的

http://example.com/products -- all products
http://example.com/products/{id} -- specific one
http://example.com/products/?country=united-sites -- filtered
Run Code Online (Sandbox Code Playgroud)

这样,您可以随时添加新过滤器,并保持清晰的URL,即使更改过滤器也不会中断.


更多信息

如果您想了解更多信息,我建议您参加由Symfony框架工作的人员DavidZülke 参加此次会议.他谈到了很多关于REST网络服务的事情,但他也特别谈到了URL,以及如何构建它们(主要是16到30分钟).

你也可以看看apigee网站.他们有很多关于REST的视频(和书籍).更具体地说,这个视频,这里真的是主题.