问题 在URL中使用重复参数


我们在内部构建API,并且经常传递具有多个值的参数。

他们使用:mysite.com?id = 1&id = 2&id = 3

而不是:mysite.com?id = 1,2,3

我赞成第二种方法,但我很好奇第一种方法实际上是不正确的吗?


11978
2017-07-23 22:29


起源

它实际上是正确的。在java中,您只需要调用request.getParameterValues(“id”)来获取字符串值数组。 - jay c.
你能指出一些说它是正确的参考吗?将Java的URL解释作为标准很难。 - Justin
是的,它实际上取决于你的网络环境,所以我们真的不能把java的解释作为标准。检查一下类似的讨论和替代方案 stackoverflow.com/questions/6243051/... - jay c.


答案:


我不是HTTP大师,但据我所知,关于多个值的URL的查询部分没有明确的标准,通常由处理解析查询字符串的请求的CGI决定。

RFC 1738 第3.3节提到a searchpart 它应该追求 ? 但似乎没有详细说明其格式。

http://<host>:<port>/<path>?<searchpart>


8
2017-07-23 22:58



CGI ......来自过去的爆炸。 - Gringo Suave


我没有(懒得)检查哪个RFC标准定义它。 (任何了解这一点的人请在评论中留下参考。)但在实践中, mysite.com?id=1&id=2&id=3 方式已经是当表单包含重复字段(通常是复选框)时浏览器将如何生成。在此看到它的实际效果 w3schools示例页面。所以你使用的编程语言很可能已经提供了一些辅助函数来解析这样的输入并且可能返回一个列表。

当然,你可以采用自己的方法,例如 mysite.com?id=1,2,3在这种特殊情况下,这一点都不错。但是您需要实现自己的逻辑来生成和使用这种格式。现在你可能需要或者不需要考虑自己处理一些极端情况,例如:如果输入结构不正确,如果 mysite.com?id=1,2,?你是否需要发明另一个分隔符,如果逗号符号本身也可以是一个有效的输入,比如 mysite.com?name=Doe,John|Doe,Jane?你会达到一个点,你将使用一个json字符串作为值,如 mysite.com?name=["John Doe", "Jane Doe"]?等等。您的里程可能会有所不同。


2
2018-01-26 22:02





在第一种方法中,您将获得一系列查询字符串值,但在第二种方法中,您将获得一串查询字符串值。


0
2017-09-18 13:34



这是误导性的: 第一种方法是获取一系列查询字符串值。这完全取决于解析查询字符串以决定如何解释它的系统。例如,在PHP中,将分配最后一个值 $_GET['id']。你必须使用这种格式: mysite.com?id[]=1&id[]=2&id[]=3 得到一个数组。 - gligoran


值得添加的是,服务器上的URL中的重复参数的不一致处理可能会导致漏洞,特别是 服务器端HTTP参数污染,有一个实际的例子 - 客户端Http参数污染 - Yahoo!经典邮件视频Poc


0
2018-05-16 12:17