★ 请求参数获取:Get 家族与对象绑定 r.Parse 对比
结论:Get 家族用于“按名随手取值”,返回 *gvar.Var 便于链式类型转换;r.Parse 用于“按结构体一键绑定 + 自动校验”。业务接口优先 r.Parse 到结构体,零星取值用 r.Get。
一、Get 家族
| API | 说明 |
|---|---|
| r.Get("key") | 从全部来源(query/form/JSON body 等)合并取值,返回 *gvar.Var |
| r.GetQuery / r.GetPost / r.GetRouter | 按来源取:URL 参数、表单/body、路由参数 |
| r.GetMap / r.GetArray / r.GetStruct | 批量获取 |
| r.GetHeader | 请求头取值 |
取值后可链式转换:r.Get("id").Int64()、.String()、.Bool() 等。
二、r.Parse 绑定
- 一次完成“参数收集 → 结构体映射 → gvalid 校验”,是规范路由底层使用的同一套能力。
- 字段映射:URL/表单参数用 p 标签(如
p:"id"),JSON body 走 json 标签;支持 d 默认值等标签(以官方文档为准)。 - 校验失败返回 gvalid.Error,可用 FirstError() 取首条错误。
代码示例
// 方式一:散值获取
name := r.Get("name").String() // *gvar.Var 链式转类型
id := r.GetQuery("id").Int64()
// 方式二:结构体绑定 + 校验
type UserReq struct {
Id int64 `p:"id" v:"required|min:1"`
Name string `json:"name" v:"length:0,30"`
}
var req UserReq
if err := r.Parse(&req); err != nil {
r.Response.WriteJsonExit(g.Map{"err": err.FirstError()})
}
常见追问 / 记忆点
- 追问:Get 与 Parse 能混用吗?→ 可以,但同一次请求建议统一风格;Parse 之后字段已入结构体,直接用 req.xxx 更清晰。
- 追问:JSON body 如何解析?→ 请求声明 application/json 时 ghttp 会自动解析进参数池,r.Get 与 r.Parse 均可读取(以官方解析规则为准)。
- 记忆点:Get = 按 key 取字典;Parse = 一键进结构体;“p”管参数名映射、“v”管校验。