479

是否有通过查询字符串传递数组的标准方法?

需要明确的是,我有一个包含多个值的查询字符串,其中一个是数组值。我希望将该查询字符串值视为一个数组 - 我不希望该数组被分解,使其与其他查询字符串变量无法区分。

另外,根据这篇帖子的回答,作者建议未定义对数组的查询字符串支持。这是准确的吗?

编辑:

根据@Alex的回答,没有标准的方法可以做到这一点,所以我的后续行动是一种简单的方法来识别我正在读取的参数是PHPJavascript中的数组?

将多个参数命名为相同的名称是否可以接受,这样我就会知道它们属于一个数组?例子:

?myarray=value1&myarray=value2&myarray=value3...

或者这是一个不好的做法?

4

11 回答 11

546

这是我发现的:

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

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

  • ?cars[]=Saab&cars[]=Audi (最好的方法——PHP 将它读入一个数组)
  • ?cars=Saab&cars=Audi (不好的方式——PHP 只会注册最后一个值)
  • ?cars=Saab,Audi (这个没试过)

表单示例

在表单上,​​多值字段可以采用设置为 multiple 的选择框的形式:

<form> 
    <select multiple="multiple" name="cars[]"> 
        <option>Volvo</option> 
        <option>Saab</option> 
        <option>Mercedes</option> 
    </select>
</form>

(注意:在这种情况下,命名选择控件很重要some_name[],这样生成的请求变量将被 PHP 注册为数组)

...或作为具有相同名称的多个隐藏字段

<input type="hidden" name="cars[]" value="Volvo">
<input type="hidden" name="cars[]" value="Saab">
<input type="hidden" name="cars[]" value="Mercedes">

注意:使用field[]多个值的文档确实很差。我在Query string - Wikipedia中的多值键部分或处理多选输入的W3C 文档中没有看到任何提及。


更新

正如评论者所指出的,这在很大程度上是特定于框架的。一些例子:

请求参数:

?list_a=1&list_a=2&list_a=3&list_b[]=1&list_b[]=2&list_b[]=3&list_c=1,2,3

导轨:

"list_a": "3", 
"list_b":[
    "1",
    "2",
    "3"
  ], 
"list_c": "1,2,3"

角度:

 "list_a": [
    "1",
    "2",
    "3"
  ],
  "list_b[]": [
    "1",
    "2",
    "3"
  ],
  "list_c": "1,2,3"

(角度讨论

有关node.jsWordpressASP.net中的示例,请参见注释


维护顺序: 要考虑的另一件事是,如果您需要维护项目的顺序(即数组作为有序列表),您实际上只有一个选择,即传递一个分隔的值列表,并将其显式转换为自己一个数组。

于 2012-03-03T16:01:04.377 回答
45

查询字符串携带文本数据,因此别无选择,只能分解数组,正确编码并以您选择的表示格式传递:

p1=value1&pN=valueN...
data=[value1,...,valueN]
data={p1:value1,...,pN:valueN}

然后在您的服务器端代码中对其进行解码。

于 2011-06-05T13:17:28.627 回答
25

我认为没有标准。
每个网络环境都为这些事情提供了自己的“标准”。此外,该 url 通常对于任何内容都太短(某些浏览器限制为 256 字节)。当然,可以使用 POST 请求发送更长的数组/数据。

但是,有一些方法:

  1. 有一种 PHP 方式,它在 URL 查询中使用方括号 ( [, )。]例如?array_name[]=item&array_name[]=item_2,尽管文档记录很差,但据说一个查询可以工作,PHP 会自动将其转换为数组。来源:https ://stackoverflow.com/a/9547490/3787376

  2. 如果对象数据交换格式(例如 JSON -官方网站PHP 文档)具有像 JSON 那样在字符串之间转换变量的方法,也可以使用它们。
    HTTP get 请求还需要一个 url 编码器(适用于大多数编程语言)才能正确编码字符串数据。

“方括号法”虽然简单有效,但仅限于 PHP 和数组。
如果需要其他类型的变量,例如类或在非 PHP 语言的查询字符串中传递变量,则建议使用 JSON 方法。

JSON方法的PHP示例(方法2):

$myarray = array(2, 46, 34, "dfg");
$serialized = json_encode($myarray)
$data = 'myarray=' . rawurlencode($serialized);
// Send to page via cURL, header() or other service.

接收页面代码(PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.
于 2011-06-05T13:46:28.150 回答
15

尽管 URL 部分没有标准,但 JavaScript 有一个标准。如果您将包含数组的对象传递给URLSearchParams并调用toString()它,它会将其转换为逗号分隔的项目列表:

let data = {
  str: 'abc',
  arr: ['abc', 123]
}

new URLSearchParams(data).toString();
// ?str=abc&arr=abc,123 (with escaped comma characters)
于 2020-03-04T21:07:51.370 回答
14

这对我有用:

在链接中, to 属性具有值:

to="/filter/arr?fruits=apple&fruits=banana"

路线可以处理这个:

path="/filter/:arr"

对于多个数组:

to="filter/arr?fruits=apple&fruits=banana&vegetables=potato&vegetables=onion"

路线保持不变。

截屏

在此处输入图像描述

更新: 为了实现这种字符串结构,查询字符串是最好的包。

例如:

import { stringify, parse } from 'query-string';

const queryParams={
   fruits:['apple','banana'],
   vegetables:['potato','onion']
}
//arrayFormat can be bracket or comma 
stringify(queryParams, { arrayFormat: 'bracket' });
于 2018-11-30T06:38:15.357 回答
7

我觉得这对于正在寻找将查询字符串中的数组传递给 servlet 的人会有所帮助。我在查询字符串下面进行了测试,并且能够使用 req.getgetParameterValues(); 获取数组值;方法。下面是我通过浏览器传递的查询字符串。

  http://localhost:8080/ServletsTutorials/*.html? 
  myname=abc&initial=xyz&checkbox=a&checkbox=b

复选框是我的参数数组。

于 2013-01-08T11:38:39.293 回答
4

我使用 React 和 Rails。我做了:

js

  let params = {
    filter_array: ['A', 'B', 'C']
  }

  ...

  //transform params in URI

  Object.keys(params).map(key => {
    if (Array.isArray(params[key])) {
      return params[key].map((value) => `${key}[]=${value}`).join('&')
    }
  }
  //filter_array[]=A&filter_array[]=B&filter_array[]=C
于 2019-09-11T18:20:58.890 回答
4

请注意,查询字符串模块列出了它支持的不同类型的数组编码(https://www.npmjs.com/package/query-string):

例如 {foo: ['1', '2', '3']} 可以编码为:

'foo[]=1&foo[]=2&foo[]=3'
'foo[0]=1&foo[1]=2&foo[3]=3'
'foo=1,2,3'
'foo=1&foo=2&foo=3'
// Any custom separator can be used:
'foo=1|2|3'
// ... and more custom formats

这表明那里采用了许多解决方案......

于 2021-04-14T16:17:19.263 回答
2

您在问题中提到了 PHP 和 Javascript,但在标签中没有提到。我遇到这个问题的目的是将数组传递给 MVC.Net 操作。

我在这里找到了我的问题的答案:预期的格式是您在问题中提出的格式,多个参数具有相同的名称。

于 2015-03-24T00:59:47.693 回答
1

您可以使用http_build_query从 PHP 中的数组生成 URL 编码的查询字符串。虽然生成的查询字符串将被扩展,但您可以决定您想要的唯一分隔符作为http_build_query方法的参数,因此在解码时,您可以检查使用的分隔符。如果它是您选择的唯一一个,那么它将是数组查询字符串,否则它将是正常的查询字符串。

于 2011-06-05T15:51:28.047 回答
0

检查parse_string函数http://php.net/manual/en/function.parse-str.php

它将返回查询字符串中的所有变量,包括数组。

来自 php.net 的示例:

<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz

parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz

?>
于 2012-03-03T16:13:02.157 回答