如何在查询字符串中传递数组?

Yar*_*rin 324 php arrays query-string querystringparameter

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

为了清楚起见,我有一个包含多个值的查询字符串,其中一个值是数组值.我希望将查询字符串值视为数组 - 我不希望数组被展开,以便它与其他查询字符串变量无法区分.

此外,根据这篇帖子的答案,作者建议不定义对数组的查询字符串支持.这准确吗?

编辑:

基于@Alex的回答,没有标准的方法可以做到这一点,所以我的后续工作是什么是一种简单的方法来识别我正在阅读的参数是PHPJavascript中的数组?

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

?myarray=value1&myarray=value2&myarray=value3...
Run Code Online (Sandbox Code Playgroud)

或者这是不好的做法?

Yar*_*rin 399

这是我想出的:

提交多值表单字段,即通过GET/POST变量提交数组,可以通过几种不同的方式完成,因为标准不一定是拼写出来的.

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

  • ?cars[]=Saab&cars[]=Audi (最佳方式 - PHP将其读入数组)
  • ?cars=Saab&cars=Audi (糟糕的方式 - PHP只会注册最后一个值)
  • ?cars=Saab,Audi (还没试过这个)

表格示例

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

<form> 
    <select multiple="multiple" name="cars[]"> 
        <option>Volvo</option> 
        <option>Saab</option> 
        <option>Mercedes</option> 
    </select>
</form>
Run Code Online (Sandbox Code Playgroud)

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

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

<input type="hidden" name="cars[]" value="Volvo">
<input type="hidden" name="cars[]" value="Saab">
<input type="hidden" name="cars[]" value="Mercedes">
Run Code Online (Sandbox Code Playgroud)

注意:使用field[]多个值实际上很难记录.我在查询字符串 - 维基百科中的多值键部分或处理多选输入的W3C文档中没有看到任何提及它.


UPDATE

正如评论者指出的那样,这是非常具体的框架.一些例子:

请求参数:

?list_a=1&list_a=2&list_a=3&list_b[]=1&list_b[]=2&list_b[]=3&list_c=1,2,3
Run Code Online (Sandbox Code Playgroud)

扶手:

"list_a": "3", 
"list_b":[
    "1",
    "2",
    "3"
  ], 
"list_c": "1,2,3"
Run Code Online (Sandbox Code Playgroud)

角度:

 "list_a": [
    "1",
    "2",
    "3"
  ],
  "list_b[]": [
    "1",
    "2",
    "3"
  ],
  "list_c": "1,2,3"
Run Code Online (Sandbox Code Playgroud)

(角度讨论)

有关node.js,Wordpress,ASP.net中的示例,请参阅注释


维护顺序:还有 一件事要考虑的是,如果你需要维护项目的顺序(即数组作为有序列表),你实际上只有一个选项,它传递一个分隔的值列表,并明确地将其转换为一个阵列自己.

  • 在快递(node.js的),这两个`?汽车=萨伯&汽车= Audi`和`?汽车[] =萨伯&汽车[] = Audi`得到变成阵列.然而,`?cars = Saab`最终成为一个字符串,但`?cars [] = Saab`是一个包含单个元素的数组. (46认同)
  • 你能用这种方法设置密钥吗?那么多维数组呢? (5认同)
  • ASP.NET MVC似乎没有读取格式`?cars [] = Saab&cars [] = Audi`有没有方形的方块或方括号需要索引/ (4认同)
  • 我认为在Wiki或W3C等一般来源中没有记录此功能的原因是它通常不受Web框架的支持.PHP和我认为Rails会自动将多个"key []"查询参数转换为数组.其他人没有. (3认同)
  • nodejs查询字符串模块使用`?cars = Saab&cars = Audi`表格 (3认同)
  • 这也取决于框架.例如,'?cars = Saab,奥迪'将适用于**Wordpress**但是`?cars [] = Saab&cars [] = Audi`不会. (2认同)
  • 响应您的注释,RFC 3986 说:`由 Internet 协议文字地址标识的主机,版本 6 [RFC3513] 或更高版本,通过将 IP 文字括在方括号(“[”和“]”)中来区分。这是 URI 语法中唯一允许方括号字符的地方。` https://tools.ietf.org/html/rfc3986 (2认同)

Ale*_* K. 36

查询字符串包含文本数据,因此没有选项可以爆炸数组,正确编码并以您选择的代表格式传递:

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

然后在服务器端代码中解码它.


Ber*_*ala 20

我认为没有标准.
每个Web环境都为这些事物提供了自己的"标准".此外,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-encoder(可用于大多数编程语言).

尽管"方括号方法"很简单且有效,但它仅限于PHP和数组.
如果需要其他类型的变量(如类或在PHP以外的语言中传递查询字符串中的变量),则建议使用JSON方法.

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

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

接收页面代码(PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.
Run Code Online (Sandbox Code Playgroud)

  • Express.js 还支持方括号表示法,已在 4.13.4 上测试。 (2认同)

Wil*_*l59 16

请注意,查询字符串模块列出了它支持的不同类型的数组编码(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
Run Code Online (Sandbox Code Playgroud)

这表明已经采用了很多解决方案......


Joã*_*aas 12

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

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

new URLSearchParams(data).toString();
// ?str=abc&arr=abc,123 (with escaped comma characters)
Run Code Online (Sandbox Code Playgroud)

  • URLSearchParams 只接受字符串参数,不接受数组!任何非字符串都只是通过正常的 toString 行为自动转换为字符串。JavaScript 通过用逗号连接条目来将数组转换为字符串这一事实不应被视为 JavaScript 在 URL 中对数组数据进行编码的标准方式。这就是 JavaScript 将数组转换为跨语言字符串的方式。 (9认同)

Ali*_*lia 11

这对我有用:

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

to="/filter/arr?fruits=apple&fruits=banana"
Run Code Online (Sandbox Code Playgroud)

Route 可以处理这个:

path="/filter/:arr"
Run Code Online (Sandbox Code Playgroud)

对于多个阵列:

to="filter/arr?fruits=apple&fruits=banana&vegetables=potato&vegetables=onion"
Run Code Online (Sandbox Code Playgroud)

路线保持不变。

截屏

在此处输入图片说明

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

例如:

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

const queryParams={
   fruits:['apple','banana'],
   vegetables:['potato','onion']
}
//arrayFormat can be bracket or comma 
stringify(queryParams, { arrayFormat: 'bracket' });
Run Code Online (Sandbox Code Playgroud)


小智 7

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

  http://localhost:8080/ServletsTutorials/*.html? 
  myname=abc&initial=xyz&checkbox=a&checkbox=b
Run Code Online (Sandbox Code Playgroud)

复选框是我的参数数组.