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] 的数组。