我有在寻找关于与HTTP GET查询字符串重复字段的行为权威信息的麻烦,像
http://example.com/page?field=foo&field=bar
并且特别是如果为了保持与否。 大多数面向Web的语言产生含有foo和关联到一个关键的“场”酒吧的数组,但我想知道是否权威的说法存在(例如,在RFC)关于这一点。 RFC 3986有一节3.4. Query
3.4. Query
,这是指键值对,但没有什么是关于如何解释订单并复制领域等说。 这是有道理的,因为它依赖于后端,而不是在RFC的范围...
虽然事实上的标准存在,我希望看到一个权威的来源,只是出于好奇。
Answer 1:
有没有这方面的天赋 。 你可以做你喜欢的事情。
典型的方法包括:第一,给出最后给出阵列的一切,串联接与 - 逗号的-所有。
假设原始请求是:
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'
Answer 2:
我可以证实,对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数据的相同。
Answer 3:
yfeldblum的答案是完美的。
就在大约五分之一的行为我最近注意到注:在Windows Phone上,用URI打开一个应用程序与重复查询密钥将导致NavigationFailed有:
System.ArgumentException:具有相同键的项已被添加。
罪魁祸首是System.Windows.Navigation.UriParsingHelper.InternalUriParseQueryStringToDictionary(Uri uri, Boolean decodeResults)
因此,该系统甚至不会让你处理它,你所希望的方式,它会禁止它。 你只剩下唯一的解决办法选择自己的格式(CSV,JSON,XML,...)和URI的转义它。
Answer 4:
大多数(全部?)的框架提供任何保证,所以以为他们会以随机顺序返回。
始终以最安全的方法。
例如Java HttpServlet的接口: ServletRequest.html#getParameterValues
即使是getParameterMap方法省去了关于参数顺序任何提及(一个java.util.Map迭代器的顺序不能在任依赖)。
Answer 5:
通常情况下,重复类似的参数值
http://example.com/page?field=foo&field=bar
导致在是一个数组的单个queryString参数:
field[0]=='foo'
field[1]=='bar'
我已经看到了ASP,ASP.NET和PHP4这种行为。
Answer 6:
我有同样的问题。 我写的JavaScript函数来解析和字符串化查询。 我不知道,如果查询字符串中有重复的姓名或名称用方括号,如X [] = 1&X [] = 2,是标准的虽然有些语言支持这些格式。
但我发现,Chrome和Firefox有一个新的类名为URLSeachParams
和它仅支持作为最简单的格式name=value
。 如果在查询字符串名称重复的get
方法URLSearchParams
只返回第一个。
所以个人,也许一个简单的,没有重复的名字网址是更对未来更安全。
文章来源: Authoritative position of duplicate HTTP GET query keys