请求参数(一):r.Get/r.GetQuery/r.GetForm 等获取方式
引言
HTTP 请求的参数可能来自 URL 查询串、表单体、路由路径等。GoFrame 把读取入口统一放在请求对象 *ghttp.Request 上,本章介绍最常用的几个方法。
概念
在 v2 的请求输入体系中(官方文档 goframe.org 的请求输入章节),常用方法有:
r.Get(key, def...):通用获取,框架按既定优先级在各类参数中查找(包含路由参数、Query、Form 等,具体范围与优先级以官方文档为准)。r.GetQuery(key, def...):只从 URL 查询串中获取。r.GetForm(key, def...):只从表单(含 multipart)中获取。- 返回类型:以上方法都返回
*gvar.Var,可调用.String()、.Int()、.Bool()等完成类型转换;带默认值写法如r.Get("page", 1),参数缺失时返回默认值。
代码示例
在一个 POST 接口里分别演示三种取法:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server()
s.Group("/user", func(group *ghttp.RouterGroup) {
// GET /user/search?keyword=gf&page=2
group.GET("/search", func(r *ghttp.Request) {
keyword := r.Get("keyword") // 通用获取
page := r.GetQuery("page", 1).Int() // 只取 Query,带默认值
r.Response.WriteJson(g.Map{
"keyword": keyword.String(),
"page": page,
})
})
// POST /user/create 表单体: name=john&age=20
group.POST("/create", func(r *ghttp.Request) {
name := r.GetForm("name") // 只取表单体
age := r.GetForm("age", 0).Int()
r.Response.WriteJson(g.Map{
"name": name.String(),
"age": age,
})
})
})
s.SetPort(8000)
s.Run()
}
测试一下:
curl "http://127.0.0.1:8000/user/search?keyword=gf&page=2"
curl -d "name=john&age=20" "http://127.0.0.1:8000/user/create"
gvar.Var 的转换方法很实用,例如 r.Get("enabled").Bool() 可把 "true"/"1"/"on" 等字符串归一化为布尔值。
注意点
- 参数不存在时
Var为空值而不是nil,.String()返回空串,配合默认值参数更稳妥。 - 同名参数出现多次时(如
?tag=a&tag=b),默认取第一个,数组形态可用对应的 Array/Map 系列方法(方法清单以官方文档为准)。 - 路由路径上的参数(如
/user/:id)也可通过r.Get系列拿到,属路由参数来源。 - 参数值本质是字符串,转成目标类型前注意边界(如空串转 Int 会得到 0)。
小结
r.Get 一把抓、r.GetQuery/r.GetForm 按来源取,配合 gvar.Var 的类型转换,单值参数的读取已够用。参数一多,逐个 Get 就繁琐了——下一章介绍用结构体一次性接收全部参数。