重复HTTP GET查询键的权威位置

问题描述 投票:126回答:6

我无法通过HTTP GET查询字符串重复字段查找有关行为的权威信息,例如

http://example.com/page?field=foo&field=bar 

特别是如果保留或不保留订单。大多数面向Web的语言产生一个包含与关键“字段”相关联的foo和bar的数组,但我想知道是否存在关于这一点的权威声明(例如在RFC上)。 RFC 3986有一个3.4. Query部分,它指的是key = value对,但没有说明如何解释顺序和重复字段等等。这是有道理的,因为它依赖于后端,而不属于RFC的范围......

虽然存在事实上的标准,但我希望看到它的权威来源,只是出于好奇。

http uri
6个回答
105
投票

这没有规范。你可以做你喜欢的事。

典型的方法包括:first-given,last-given,array-of-all,string-join-with-comma-of-all。

假设原始请求是:

GET /blog/posts?tag=ruby&tag=rails HTTP/1.1
Host: example.com

然后根据语言或框架,request.query['tag']应该有多种选择:

request.query['tag'] => 'ruby'
request.query['tag'] => 'rails'
request.query['tag'] => ['ruby', 'rails']
request.query['tag'] => 'ruby,rails'

14
投票

我可以确认对于PHP(至少在4.4.4及更高版本中),它的工作原理如下:

GET /blog/posts?tag=ruby&tag=rails HTTP/1.1
Host: example.com

结果是:

request.query['tag'] => 'rails'

GET /blog/posts?tag[]=ruby&tag[]=rails HTTP/1.1
Host: example.com

结果是:

request.query['tag'] => ['ruby', 'rails']

对于GET和POST数据,此行为是相同的。


7
投票

yfeldblum的回答很完美。

关于我最近注意到的第五种行为的注释:在Windows Phone上,使用带有重复查询键的uri打开应用程序将导致NavigationFailed:

System.ArgumentException:已添加具有相同键的项。

罪魁祸首是System.Windows.Navigation.UriParsingHelper.InternalUriParseQueryStringToDictionary(Uri uri, Boolean decodeResults)

所以系统甚至不会让你按照你想要的方式处理它,它会禁止它。您只剩下选择自己的格式(CSV,JSON,XML,...)和uri-escape-it的唯一解决方案。


5
投票

大多数(所有?)框架都不提供任何保证,因此假设它们将以随机顺序返回。

始终采取最安全的方法。

例如,java HttpServlet接口:ServletRequest.html#getParameterValues

甚至getParameterMap方法都没有提及有关参数顺序的任何提及(也不能依赖java.util.Map迭代器的顺序。)


4
投票

通常,重复的参数值如

http://example.com/page?field=foo&field=bar

导致一个queryString参数是一个数组:

field[0]=='foo'
field[1]=='bar'

我在ASP,ASP.NET和PHP4中看到过这种行为。


0
投票

我有同样的问题。我正在编写javascript函数来解析和字符串化查询。我不知道查询字符串是否有重复的名称或带括号的名称,例如x [] = 1&x [] = 2,虽然某些语言支持这些格式,但它是标准的。

但我发现Chrome和Firefox有一个名为URLSeachParams的新类,它只支持最简单的格式name=value。如果查询字符串中存在重复的名称,则getURLSearchParams方法仅返回第一个。

所以个人而言,也许最简单,没有重复名称的网址对未来更安全。

© www.soinside.com 2019 - 2024. All rights reserved.