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

时间:2014-06-05 12:05:20

标签: http get

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

我看过这样的网址:

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

我看过这样的网址:

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

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

我不想要一个答案,说'&34;要么是好的" - 如果我正在构建一个Web服务,我想知道哪些方法是标准的,以便使用我的web服务的人知道如何为同一个名称传递多个参数。

那么,有人可以指点我的官方参考资料来确认哪个选项是正确的吗?

7 个答案:

答案 0 :(得分:126)

确实,没有明确的标准。要在Query String章节中查看维基百科,请支持该信息。有以下评论:

  

虽然没有确定的标准,但大多数Web框架都允许   要与单个字段关联的多个值。[3] [4]

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

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

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

答案 1 :(得分:3)

我正在描述一种简单的方法,该方法在Python(Django框架)中非常顺利。

1。发送请求时,像这样发送请求

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

2。现在在后端,我使用拆分函数拆分接收到的值,该拆分函数始终创建一个列表。

id_filter = id.split(',')

示例: 因此,如果我在请求中发送两个值,

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

然后对数据进行过滤

id_filter = ['a', 'b']

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

http://server/action?id=a

那么过滤结果是

id_filter = ['a']

3。要实际过滤数据,我只需使用“输入”功能

queryset = queryset.filter(model_id__in=id_filter)

粗略地讲相当于SQL的

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

第一个请求 并且,

WHERE model_id IN ('a')

第二个请求。

这也可以在请求中使用两个以上的参数值!

答案 2 :(得分:1)

上述解决方案不起作用。它只是显示最后的键/值对,但确实如此:

<块引用>

http://localhost/?key[]=1&key[]=2

返回:

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

答案 3 :(得分:1)

我的回答更面向PHP

提交多值表单字段,即提交数组,可以通过几种不同的方式来完成,因为不一定要详细说明标准。

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

  • ?cars[]=Saab&cars[]=Audi(最佳方式 - PHP 将其读入数组)
  • ?cars=Saab&cars=Audi(糟糕的方式 - PHP 只会注册最后一个值)
  • ?cars=Saab,Audi(一般方法 - 您需要分解字符串才能将值作为数组)

例如:

<块引用>

http://localhost:3000/foo?id[]=a&id[]=b

退货

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

(注意:在这种情况下,将查询键命名为 some_name[] 很重要,这样生成的请求变量就会被 PHP 注册为数组)

答案 4 :(得分:0)

我建议查看默认情况下浏览器如何处理表单。例如,在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>

Live example from above at w3schools.com

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

希望这可以帮助寻找更“标准”方式处理此问题的人。

答案 5 :(得分:0)

没有标准,但是大多数框架都支持这两个标准,例如,对于java spring,它可以同时接受here

@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]

答案 6 :(得分:0)

由于 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);
                }