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

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

我见过这样的url:

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

我见过这样的url:

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

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

我不想要一个说“任何一个都可以”的答案——如果我正在构建一个webservice,我想知道这些方法中哪些是标准的,以便使用我的webservice的人知道如何为相同的名称传递多个参数。

那么,谁能给我指出一个官方参考来源来确认哪个选项是正确的呢?

321795 次浏览

事实上,没有明确的标准。要支持这些信息,请查看维基百科的查询字符串章节。有以下评论:

虽然没有明确的标准,但大多数web框架都允许 __abc0__abc1

此外,当你看一下RFC 3986时,在3.4查询节中,没有多值参数的定义。

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

但是,由于您正在开发API,我建议您使用对您来说最简单的方法,因为API的调用者在创建查询字符串时不会遇到太多麻烦。

我建议看看浏览器在默认情况下是如何处理表单的。例如,看看w3schools中的表单元素<select multiple>以及它如何处理这个例子中的多个值。

<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”并点击提交,它将生成欧宝汽车= saab&汽车=的结果。然后,根据后端服务器的不同,参数汽车应该是一个可以进一步处理的数组。

希望这能帮助到那些寻找更“标准”的方法来处理这个问题的人。

我描述了一个简单的方法,它在Python (Django Framework)中非常顺利地工作。

1. 在发送请求时,像这样发送请求

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

2. 现在在我的后端,我用split函数分割接收到的值,它总是创建一个列表。

id_filter = id.split(',')

< em >的例子: 如果我在请求中发送两个值

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

那么数据上的过滤器是

id_filter = ['a', 'b']

如果我在请求中只发送一个值,

http://server/action?id=a

那么过滤器的结果是

id_filter = ['a']

3.要实际过滤数据,我只需使用'in'函数

queryset = queryset.filter(model_id__in=id_filter)

粗略地说,执行SQL等效

WHERE model_id IN ('a', 'b')

与第一个请求 , < / p >

WHERE model_id IN ('a')

第二个请求。

这也可以在请求中处理超过2个参数值!

没有标准,但大多数框架都支持,例如你可以看到java spring它接受在这里

@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam List<String> id) {
return "IDs are " + id;
}

Spring MVC将映射一个以逗号分隔的id参数:

http://localhost:8080/api/foos?id=1,2,3
----
IDs are [1,2,3]

或者一个单独的id参数列表:

http://localhost:8080/api/foos?id=1&id=2
----
IDs are [1,2]

上述解决方案并不奏效。它只是简单地显示了最后的键/值对,但是这样做了:

http://localhost/?key[] = - 1,关键[]= 2

返回:

Array
(
[key] => Array
(
[0] => 1
[1] => 2
)

我的答案更偏向于__abc0。

提交多值表单字段,即提交数组,可以在几种不同的方法中完成,因为没有必要详细说明标准。

发送多值字段或数组的三种可能的方法是:

  • cars[]=Saab&cars[]=Audi(最好的方法- PHP将此读入数组)
  • ?cars=Saab&cars=Audi(不好的方法- PHP只会记录最后一个值)
  • ?cars=Saab,Audi(一般方式-您需要爆炸字符串以获取数组值)

例如:

http://localhost:3000/foo?[] =第一部;id [] = b

返回

Array
(
[id] => Array
(
[0] => a
[1] => b
)
)

(注意:在这种情况下,将查询键命名为some_name[]非常重要,这样得到的请求变量将被PHP注册为数组)

由于url是一个参数和多个值。java中一个非常简单的解决方案是分割字符串,然后将它附加到self。例如:

String baseUrl = "http://server/action"
String id = "a,b";
StringBuilder url = new StringBuilder();
url = baseUrl.append("?");
String[] idArr = id.split(",");
StringBuilder sb = new StringBuilder();
for ( String fetchId : idArr) {
sb.append("&id=").append(fetchId);
url.append(sb);
}