★ 请求参数获取: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”管校验。
笔记加载中…