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

我很难find有关HTTP GET查询string重复字段的行为的权威性信息

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

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

虽然存在一个事实上的标准,但是出于好奇,我想看到一个权威的来源。

没有这方面的规格 。 你可以做你喜欢的。

典型的方法包括:首先给定,最后给定,数组,string连接与逗号。

假设原始请求是:

 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' 

我可以证实,对于PHP(至less在版本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数据的这种行为是相同的。

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

始终采取最安全的方法。

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

即使getParameterMap方法也没有提及参数顺序(java.util.Map迭代器的顺序也不能被依赖)。

yfeldblum的答案是完美的。

只是关于我最近注意到的第五个行为的说明:在Windows Phone上 ,打开与重复的查询键与uri的应用程序将导致NavigationFailed与:

System.ArgumentException:具有相同密钥的项目已被添加。

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

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

通常,重复的参数值如

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

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

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

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

我有同样的问题。 我正在写JavaScriptfunctionparsing和串化查询。 我不知道如果查询string有重复的名称或名称与括号,如x [] = 1和x [] = 2,是标准的,虽然有些语言支持这些格式。

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

因此,个人而言,也许最简单,没有重复的名称url更安全的未来。