在GET请求中传递相同参数名称的多个值的正确方法


191

我正在研究在GET请求中为同一参数名称传递多个值的正确方法是什么。

我看过这样的网址:

http://server/action?id=a&id=b

我看过这样的网址:

http://server/action?id=a,b

我的理解是第一个是正确的,但是我找不到任何参考。我看了看http规范,但看不到应该如何构成URL的“查询”部分。

我不希望回答“都很好”-如果我正在构建Web服务,我想知道以下哪种方法是标准的,以便使用我的Web服务的人知道如何为同一个名称传递多个参数。

因此,有人可以指出我的官方参考资料来确认哪个选项正确吗?

Answers:


163

确实,没有定义的标准。要支持该信息,请在“ 查询字符串”一章中查看维基百科。有以下评论:

尽管没有明确的标准,但是大多数Web框架都允许将多个值与单个字段相关联。[3] [4]

此外,当您查看RFC 3986的3.4 Query部分时,没有定义具有多个值的参数。

大多数应用程序使用您显示的第一个选项:http://server/action?id=a&id=b。为了支持该信息,请查看此Stackoverflow链接和有关ASP.NET应用程序的MSDN链接,这些链接对具有多个值的参数使用相同的标准。

但是,由于您正在开发API,所以我建议您做最简单的事情,因为API的调用者在创建查询字符串时不会有太多麻烦。


如果没有任何相反的信息,我想您是对的-如果RFC3986没有指定标准,那么就没有标准。谢谢爱德华多。
stripybadger

18
A建议使用id=a&id=b布尔AND和id=a,b布尔OR。
Alex Skrypnyk's

16
FWIW PHP不支持读取args之类的参数?id=5&id=3。PHP在这里只会读取一个id值。如果我没记错的话,它必须看起来像这样才能与PHP一起使用:?id[]=5&id[]=3

3
+1since you are developing the APIs, I suggest you to do what is the easiest for you, since the caller of the API will not have much trouble creating the query string.
Amr

2
id=a,b假定逗号,是有效的定界符。但是您的参数值可以包含,。然后,客户端需要转义,查询参数值。但是您可以决定;更好。这意味着客户端和服务器应共享API的官方分隔符。id=a&id=b即使它使URL更长也不会出现此问题
Ronan Quillevere

5

我建议查看默认情况下浏览器如何处理表单。<select multiple>例如,在w3schools中,查看一下form元素及其如何处理多个值。

<form action="/action_page.php">
<select name="cars" multiple>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>
<input type="submit">
</form>

对于PHP使用:

<select name="cars[]" multiple>

来自w3schools.com的现场示例

如果从上方单击“ saab,opel”,然后单击“提交”,则将生成cars = saab&cars = opel的结果。然后,取决于后端服务器,参数cars应该作为可以进一步处理的数组出现。

希望这对寻求更“标准”方式处理此问题的人有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.