我正在研究在GET请求中为相同的参数名传递多个值的正确方法。
我见过这样的url:
http://server/action?id=a&id=b
我见过这样的url:
http://server/action?id=a,b
我的理解是第一个是正确的,但我找不到任何参考。我看了一下http规范,但没有看到任何关于URL的“查询”部分应该如何组成。
我不想要一个说“任何一个都可以”的答案——如果我正在构建一个webservice,我想知道这些方法中哪些是标准的,以便使用我的webservice的人知道如何为相同的名称传递多个参数。
那么,谁能给我指出一个官方参考来源来确认哪个选项是正确的呢?
我描述了一个简单的方法,它在Python (Django Framework)中非常顺利地工作。
1. 在发送请求时,像这样发送请求
http://server/action?id=a,b
2. 现在在我的后端,我用split函数分割接收到的值,它总是创建一个列表。
id_filter = id.split(',')
例子:
如果我在请求中发送两个值,
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')
第一个请求
而且,
WHERE model_id IN ('a')
第二个请求。
这也可以在请求中处理超过2个参数值!
我的答案更倾向于php。
提交多值表单字段,即提交数组,可以通过几种不同的方式完成,因为没有必要详细说明标准。
发送多值字段或数组的三种可能的方法是:
?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注册为数组)
我建议看看浏览器在默认情况下是如何处理表单的。例如,在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”并点击提交,它将生成一个结果:cars=saab&cars=opel。然后,根据后端服务器的不同,参数cars应该是一个可以进一步处理的数组。
希望这能帮助到那些寻找更“标准”的方法来处理这个问题的人。
没有标准,但是大多数框架都支持这两种,你可以看到,例如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]