我们正在内部构建API,并且经常传递具有多个值的参数。
他们使用:mysite.com?id=1&id=2&id=3
而不是:mysite.com?id = 1,2,3
我赞成第二种方法,但我很好奇第一种方法实际上是不正确的吗?
答案 0 :(得分:8)
我不是HTTP大师,但根据我的理解,关于多个值的URL的查询部分没有明确的标准,通常由处理解析查询字符串的请求的CGI决定。
RFC 1738第3.3节提到searchpart
并且它应该在?
之后,但似乎没有详细说明其格式。
http://<host>:<port>/<path>?<searchpart>
答案 1 :(得分:2)
我没有(懒得)检查哪个RFC标准定义了它。 (任何了解此问题的人请在评论中留下参考。)但实际上,mysite.com?id=1&id=2&id=3
方式已经是表单包含重复字段(通常是复选框)时浏览器的产生方式。请参阅此w3schools example page中的实际操作。所以你使用的编程语言很可能已经提供了一些辅助函数来解析这样的输入并且可能返回一个列表。
当然,您可以使用自己的方法,例如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 :(得分:0)
在第一种方法中,您将获得一系列查询字符串值,但在第二种方法中,您将获得一串查询字符串值。
答案 3 :(得分:0)
值得补充的是,服务器上URL中的重复参数的不一致处理可能会导致漏洞,特别是server-side HTTP parameter pollution,并附带一个实际示例 - Client side Http Parameter Pollution - Yahoo! Classic Mail Video Poc。
答案 4 :(得分:0)
我想这取决于您使用的技术以及它如何变得方便。我目前正使用currency=USD,CHF
或currency=USD¤cy=CHF
我正在使用Thymeleaf,使用第二个选项使工作变得容易,然后我可以请求类似${param.currency.contains(currency.value)}
的内容。当我尝试使用第一个选项时,似乎它像字符串一样接收“数组”,因此我需要先拆分然后包含,这使我产生了更多的混乱代码。
只有我的50美分:-)