18

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

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

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

我赞成第二种方法,但我很好奇第一种方法是否真的不正确?

4

5 回答 5

9

我不是 HTTP 专家,但据我了解,关于多个值的 URL 的查询部分没有明确的标准,通常取决于处理请求以解析查询字符串的 CGI。

RFC 1738第 3.3 节提到 asearchpart并且它应该在之后,?但似乎没有详细说明它的格式。

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

于 2012-07-23T22:58:34.297 回答
3

我没有(费心)检查哪个 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"]?等等等等。您的里程可能会有所不同。

于 2017-01-26T22:02:11.667 回答
3

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

于 2017-05-16T12:17:33.820 回答
0

在您的第一种方法中,您将获得一个查询字符串值数组,但在第二种方法中,您将获得一个查询字符串值字符串。

于 2012-09-18T13:34:12.463 回答
0

我想这取决于您使用的技术,它如何变得方便。我目前正站在同一个问题的前面,使用currency=USD,CHFcurrency=USD&currency=CHF

我正在使用 Thymeleaf 并且使用第二个选项可以轻松工作,然后我可以请求类似:${param.currency.contains(currency.value)}. 当我尝试使用第一个选项时,它似乎需要像字符串一样的“数组”,所以我需要先拆分然后包含,这导致我的代码更加混乱。

只是我的 50 美分 :-)

于 2020-02-19T16:02:42.380 回答