【问题标题】:Using Query String in REST Web Services在 REST Web 服务中使用查询字符串
【发布时间】:2013-08-27 18:42:14
【问题描述】:

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

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

【问题讨论】:

  • “不使用路径参数”?
  • 是的,RESTful uris 仅使用路径参数的想法是一个谬误。 URI 只是一个标识符,您可以使用它的任何部分和所有部分来识别资源。

标签: web-services rest query-parameters path-parameter


【解决方案1】:

查询字符串仍然可以在 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

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

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


我的建议

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

所以表格应该是这样的

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

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


更多信息

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

您也可以查看apigee website。他们有很多关于 REST 的视频(和书籍)。更确切地说是this video,这是真正的主题。

【讨论】:

  • /domain/products/{id} 让您完全了解 pickle rest 试图避免的内容……您会得到模棱两可的 uri,这违背了 uri 指向资源的目的。为了不那么模棱两可,它应该类似于 /domain/products/id/{id}。然后,如果您想要美国产品 /domain/products/country/usa。 uri 是用于对资源进行分区的分区方案。唯一使用查询字符串的情况是分区没有意义。
猜你喜欢
  • 2019-02-19
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 2012-08-09
  • 2016-06-25
相关资源
最近更新 更多