在 Url 的 Query 中传递 Array 的各种姿势
⚙️

在 Url 的 Query 中传递 Array 的各种姿势

Status
Publish
Tags
HTTP
Property
Column
May 8, 2021 03:54 AM

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