在URL中重复使用参数

20

我们正在内部构建一个API,通常需要传递带有多个值的参数。

他们使用的方式是:mysite.com?id=1&id=2&id=3

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

我更喜欢第二种方式,但我想知道第一种方式是否真的是错误的?


实际上是正确的。在Java中,您只需要调用request.getParameterValues("id")即可获取字符串值数组。 - jay c.
1
你能指出一些证明这是正确的参考资料吗?很难将Java对URL的解释视为标准。 - Justin
是的,实际上这取决于您的网络环境,所以我们不能将Java的解释视为标准。请查看以下类似讨论和替代方案:https://dev59.com/2G025IYBdhLWcg3wEhZb - jay c.
为了保险起见,我只是在 connection-string 中实现了两者,以便得到包含所有值的数组。因此,您的输入 ?a=1&a=2,3,4&a=5 被解析为 a = [1, 2, 3, 4, 5] - vitaly-t
这是一个重复的问题,原问题已经在stackoverflow上得到更好的回答了。 - Lee
5个回答

11
我不是HTTP专家,但据我了解,关于URL查询部分的多个值并没有明确的标准,通常由处理请求的CGI来解析查询字符串。 RFC 1738第3.3节提到了一个searchpart,应该在?之后,但似乎没有详细说明其格式。

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


CGI……过去的回忆。 - Gringo Suave

5

我没有(费心)查看定义它的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"]?等等等等。您的具体情况可能会有所不同。


w3schools的链接仍然是第一种方法的有效示例吗? - vdwees
@vdwees 为什么不呢? - RayLuo
当我勾选框并点击提交时,它显示输入为vehicle1=Bike&vehicle2=Car&vehicle3=Boat。我认为问题是在询问vehicle=Bike&vehicle=Car&vehicle=Boat吗? - vdwees
哦,我明白了。在我回答之后,他们改变了那个例子。这很不幸,我无法控制那一部分。但是你可以继续更改他们示例的在线代码片段,使用相同的名称来命名所有三个复选框输入字段,然后您将看到预期的效果。这就是复选框应该工作的方式。W3Cschool 在他们的示例中搞砸了(可能是当他们将标签引入到他们的示例中时 - 但那是另一个话题)。 - RayLuo

3

0

我猜这取决于你使用的技术,它如何变得方便。我目前面临着同样的问题,使用currency=USD,CHFcurrency=USD&currency=CHF

我正在使用Thymeleaf,并且使用第二个选项使工作变得容易,然后我可以请求类似于:${param.currency.contains(currency.value)}。当我尝试使用第一个选项时,它似乎将“数组”视为字符串,因此我需要先拆分,然后再进行包含,这导致我的代码更加混乱。

只是我的50美分 :-)


0
在你的第一种方法中,你会得到一个查询字符串值的数组,但在第二种方法中,你会得到一个查询字符串值的字符串。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接