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

问题描述 投票:0回答:8

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

我见过这样的网址:

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

我见过这样的网址:

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

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

我不想要一个“都可以”的答案 - 如果我正在构建一个 Web 服务,我想知道这些方法中哪一个是标准的,以便使用我的 Web 服务的人知道如何传递同名的多个参数.

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

http get
8个回答
266
投票

确实,没有明确的标准。要支持该信息,请查看维基百科的“查询字符串”章节。有如下评论:

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

[4]

此外,当您查看
RFC 3986

时,在第3.4查询节中,没有对具有多个值的参数的定义。 大多数应用程序使用您显示的第一个选项:

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

。要支持该信息,请查看有关 ASP.NET 应用程序的

Stackoverflow 链接
MSDN 链接,它们对具有多个值的参数使用相同的标准。 但是,由于您正在开发 API,我建议您做对您来说最简单的事情,因为 API 的调用者在创建查询字符串时不会遇到太多麻烦。


27
投票
<select multiple>

以及它如何处理 w3schools 示例中的多个值。


<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 应该作为一个数组出现,您可以进一步处理。 希望这可以帮助任何寻求更“标准”方法来处理此问题的人。


15
投票

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 个参数值!


4
投票
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 将生成的请求变量注册为数组)


3
投票

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

退货:

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



2
投票
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]



0
投票

https://download.eclipse.org/microprofile/microprofile-rest-client-2.0/apidocs/org/eclipse/microprofile/rest/client/ext/QueryParamStyle.html


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.