我认为使用 REST Web 服务的一个主要特征和原因是使用路径参数而不是查询参数。但是许多公开可用的 REST Web 服务使用查询参数。
我认为查询参数不应该在 REST Web 服务中使用是错误的吗?是否有关于不在 REST Web 服务中使用查询参数的建议或规则?
我认为使用 REST Web 服务的一个主要特征和原因是使用路径参数而不是查询参数。但是许多公开可用的 REST Web 服务使用查询参数。
我认为查询参数不应该在 REST Web 服务中使用是错误的吗?是否有关于不在 REST Web 服务中使用查询参数的建议或规则?
查询字符串仍然可以在 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 分钟)。