重复的HTTP GET查询键的权威性位置
我很难find有关HTTP GET查询string重复字段的行为的权威性信息
http://example.com/page?field=foo&field=bar
特别是如果订单被保留的话。 大多数面向Web的语言都会产生一个包含与关键字“字段”关联的foo和bar的数组,但是我想知道关于这一点是否存在权威性声明(例如在RFC上)。 RFC 3986有一个3.4. Query
节3.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中有重复名称,则URLSearchParams
的get
方法只返回第一个。
因此,个人而言,也许最简单,没有重复的名称url更安全的未来。