本章节的复杂参数针对于传统的Query或者Form参数传递,由于这两种参数传递方式对复杂参数传递的管理维护不是很优雅,因为我们推荐大家遇到复杂参数传递的场景尽量使用JSON数据编码来管理维护。
Query
Form
JSON
ghttp.Request对象支持智能的参数类型解析(不区分请求提交方式及请求提交类型),以下为提交参数示例以及服务端对应解析的变量类型:
ghttp.Request
k=m&k=n
map[k:n]
k1=m&k2=n
map[k1:m k2:n]
k[]=m&k[]=n
map[k:[m n]]
k[a][]=m&k[a][]=n
map[k:map[a:[m n]]]
k[a]=m&k[b]=n
map[k:map[a:m b:n]]
k[a][a]=m&k[a][b]=n
map[k:map[a:map[a:m b:n]]]
k=m&k[a]=n
error
同名参数提交格式形如:k=v1&k=v2 ,后续的变量值将会覆盖前面的变量值。
k=v1&k=v2
package main import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" ) func main() { s := g.Server() s.BindHandler("/", func(r *ghttp.Request) { r.Response.Write(r.Get("name")) }) s.SetPort(8199) s.Run() }
执行后,我们访问 http://127.0.0.1:8199/?name=john&name=smith 后,将会得到返回值 smith 。
smith
注意:框架的HTTP Server在这块的处理逻辑参考PHP,会和Go标准库的处理逻辑有所差异。在Go标准库net/http处理中,提交的同名参数将会被转换为字符串数组。
HTTP Server
PHP
Go
net/http
数组参数提交格式形如:k[]=v1&k[]=v2,即以空的中括号[]来表示数组参数。
k[]=v1&k[]=v2
[]
package main import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" ) func main() { s := g.Server() s.BindHandler("/", func(r *ghttp.Request) { r.Response.Write(r.Get("array")) }) s.SetPort(8199) s.Run() }
执行后,我们访问 http://127.0.0.1:8199/?array[]=john&array[]=smith 后,将会得到返回值 ["john","smith"] 。
["john","smith"]
注意:如果传递的参数带有中括号以及索引号,那么该参数按照前面介绍的复杂参数转换规则将会被转换为map。例如,array[0]=john&array[1]=smith,将会被转换为map{"0":"john","1":"smith"}。
map
array[0]=john&array[1]=smith
map{"0":"john","1":"smith"}
Map
Map参数提交格式形如:k[a]=m&k[b]=n,并且支持多级Map,例如:k[a][a]=m&k[a][b]=n。
package main import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" ) func main() { s := g.Server() s.BindHandler("/", func(r *ghttp.Request) { r.Response.Write(r.Get("map")) }) s.SetPort(8199) s.Run() }
执行后,我们访问 http://127.0.0.1:8199/?map[id]=1&map[name]=john 后,将会得到返回值 {"id":"1","name":"john"} 。
{"id":"1","name":"john"}
我们再试试多级Map,手动访问以下地址
http://127.0.0.1:8199/?map[user1][id]=1&map[user1][name]=john&map[user2][id]=2&map[user2][name]=smith
将会得到返回值 {"user1":{"id":"1","name":"john"},"user2":{"id":"2","name":"smith"}} 。
{"user1":{"id":"1","name":"john"},"user2":{"id":"2","name":"smith"}}