11

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

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

4

1 回答 1

27

查询字符串仍然可以在 REST Web 服务中使用,只是方式不同。

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

http://example.com/products/123   -- where 123 is the id of the products.

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


为每个过滤器使用斜线的问题

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

http://example.com/products/united-states

好吧,现在乍一看有些模棱两可。美国是身份证吗?好吧,可以通过将 id 表示为来解决歧义\d+。正确的。

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

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

http://example.com/products/united-states/home/asc

但我不只想要美国产品!但还是想要家用产品。

http://example.com/products/home/asc

等等……家是一个国家吗?我现在不确定,这有点模棱两可......如果我明天想添加另一个过滤器怎么办?我会怎么做...添加更多的斜线?

URL 变得杂乱无章,充满了模棱两可的参数,这些参数起初是可选的,但由于模棱两可而变得强制性。


我的建议

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

所以表格应该是这样的

http://example.com/products -- all products
http://example.com/products/{id} -- specific one
http://example.com/products/?country=united-sites -- filtered

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


更多信息

如果你想了解更多信息,我真的非常建议你看看David Zülke的这次会议,他是为 Symfony 框架工作的人。他谈到了很多关于 REST Web 服务的事情,但他也专门谈到了 URL,以及如何构建它们(主要是 16 到 30 分钟)

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

于 2013-04-21T18:44:51.240 回答