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

str*_*ger 170 get http

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

我见过这样的网址:

http://server/action?id=a&id=b
Run Code Online (Sandbox Code Playgroud)

我看过这样的网址:

http://server/action?id=a,b
Run Code Online (Sandbox Code Playgroud)

我的理解是第一个是正确的,但我找不到任何参考.我查看了http规范,但是看不出有关如何构成URL的'query'部分的任何信息.

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

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

Edu*_*des 145

实际上,没有明确的标准.要查看该信息,请查看维基百科,在" 查询字符串"一章中.有以下评论:

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

此外,当您查看RFC 3986时,在3.4查询中,没有具有多个值的参数的定义.

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

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

  • A建议使用`id = a&id = b`作为布尔AND,并将`id = a,b`作为布尔OR. (15认同)
  • FWIW PHP不支持读取诸如`?id = 5&id = 3`之类的args.PHP只会在这里为id读取一个值.如果我没记错的话,它必须看起来像这样才能使用PHP:`?id [] = 5&id [] = 3` (15认同)
  • `id=a,b` 假设 coma `,` 是一个有效的分隔符。但是您的参数值可能包含一个`,`。然后客户端需要在查询参数值中转义`,`。但是你可以决定`;`更好。这意味着客户端和服务器应该共享您的 API 的官方分隔符。`id=a&id=b` 没有这个问题,即使它使 url 变长 (6认同)
  • 因为你正在开发API,所以我建议你做最简单的事情,因为API的调用者在创建查询字符串时不会有太多麻烦. (2认同)

pha*_*anf 8

我建议查看默认情况下浏览器如何处理表单。<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>
Run Code Online (Sandbox Code Playgroud)

对于 PHP 使用:

<select name="cars[]" multiple>
Run Code Online (Sandbox Code Playgroud)

w3schools.com 上的现场示例

从上面如果你点击“saab, opel”并点击提交,它会生成一个结果cars=saab&cars=opel。然后根据后端服务器,参数汽车应该作为一个数组出现,您可以进一步处理。

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


MGL*_*don 7

我正在描述一个简单的方法,它在 Python(Django 框架)中工作得非常顺利。

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

http://server/action?id=a,b
Run Code Online (Sandbox Code Playgroud)

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

id_filter = id.split(',')
Run Code Online (Sandbox Code Playgroud)

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

http://server/action?id=a,b
Run Code Online (Sandbox Code Playgroud)

然后对数据的过滤器是

id_filter = ['a', 'b']
Run Code Online (Sandbox Code Playgroud)

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

http://server/action?id=a
Run Code Online (Sandbox Code Playgroud)

那么过滤结果是

id_filter = ['a']
Run Code Online (Sandbox Code Playgroud)

3.为了真正过滤数据,我简单地使用了'in'函数

queryset = queryset.filter(model_id__in=id_filter)
Run Code Online (Sandbox Code Playgroud)

粗略地说,它执行的 SQL 相当于

WHERE model_id IN ('a', 'b')
Run Code Online (Sandbox Code Playgroud)

与第一个请求和,

WHERE model_id IN ('a')
Run Code Online (Sandbox Code Playgroud)

与第二个请求。

这也适用于请求中 2 个以上的参数值!

  • 如果值本身有逗号怎么办?就像我可能有 2 个值,例如:“abc”“p,q” (2认同)