如何在 Url 的 Query 中传递 Array
⚙️
如何在 Url 的 Query 中传递 Array
Status
Publish
Tags
HTTP

RFC 定义

RFC 中并没有规定 URL Query 的参数含义,只要求了采用 K=V 这种形式来传递数据。
可用的几种约束
'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'
'foo=1|2|3'

在各语言中,如何约定 Array 的传递方式

Python

Python 中进行 encode
>>> from urllib.parse import urlencode
>>> query_data = {"foo":[1,2,3]}
>>> urlencode(query_data)
'foo=%5B1%2C+2%2C+3%5D'
>>> urlencode(query_data,True)
'foo=1&foo=2&foo=3'
Python 的 urlencode 如果不传递 doseq 参数,则会对所有非 str 方法执行 str,随后返回一个 tuple。
Python 中进行 Decode
>>> from urllib.parse import parse_qs
>>> parse_qs('foo=%5B1%2C+2%2C+3%5D')
{'foo': ['[1, 2, 3]']}
>>> parse_qs('foo=1&foo=2')
{'foo': ['1', '2']}

Node


> const querystring = require('querystring');
undefined
> querystring.decode("foo=1&foo=2")
[Object: null prototype] { foo: [ '1', '2' ] }
> querystring.encode({ foo: [ '1', '2' ] })
'foo=1&foo=2'

Golang

gore version 0.5.1  :help for help
gore> :import net/url
gore> m, _ := url.ParseQuery(`foo=1&foo=1`)
url.Values{
  "foo": []string{
    "1",
    "1",
  },
}

结论

在 Python/Node/Golang 的三个默认库中,均使用了 foo=1&foo=2 这种方式来传递 foo = [1,2] 的数组。

Loading Comments...