重复HTTP GET查询键的权威地位重复HTTP GET查询键的权威地位(Authoritative

2019-05-08 16:29发布

我有在寻找关于与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
标签: http uri