Beego中通过GetString、GetInt等方法可自动获取URL查询参数和表单字段,无需手动解析;但JSON请求需启用EnableJsonUnmarshal并用json.Unmarshal解析RequestBody,且须配置copyrequestbody=true才能读取原始请求体。

Beego里怎么取URL查询参数和表单字段
直接用GetString、GetInt这类方法就行,它们自动从GET查询串或POST表单(application/x-www-form-urlencoded)里提取值,不需要手动解析。
常见错误现象:调用GetString("id")返回空字符串,但实际请求里带了?id=123——大概率是路由没匹配上,或者控制器方法没被正确调用(比如写了Post()却发了GET请求)。
-
GetString("key")返回string,key不存在时返回空字符串 -
GetInt("id")返回(int64, error),别直接转int,Go里int平台相关 - 路径参数(如
/user/:id)要用c.Ctx.Input.Param(":id")或c.GetString(":id") - 如果参数名含点号(
user.email),Beego默认不支持嵌套解析,得自己用Input().Get()拿原始字符串再拆
JSON请求体为什么ParseForm拿不到数据
ParseForm只处理application/x-www-form-urlencoded和multipart/form-data,对application/json完全无效。微信支付开票、Vue Axios POST 默认都是 JSON,这时this.Ctx.Input.RequestBody是原始字节,但ParseForm(&u)会静默失败或填零值。
实操建议:
- 确保
conf/app.conf里有EnableJsonUnmarshal = true(Beego 2.x 默认开启,1.x 必须显式设) - 定义结构体时,字段必须首字母大写,且用
json:"field_name"tag 显式映射 - 用
json.Unmarshal(this.Ctx.Input.RequestBody, &req)解析,不要碰ParseForm - 校验
scene字段是否为"WITH_WECHATPAY"或"WITHOUT_WECHATPAY",微信接口严格校验这个值
如何把请求参数一键绑定到struct
Beego支持两种绑定方式:表单用ParseForm,JSON用json.Unmarshal,但不能混用。想让一个struct同时兼容两种来源,得自己判断Content-Type再分发。
容易踩的坑:
-
ParseForm(&u)传入的必须是指针,ParseForm(u)会报xx must be a struct pointer - struct字段加
form:"-"可忽略,小写字段名也会被跳过(Go反射限制) - JSON绑定时,
*string类型能区分“字段缺失”和“字段为空字符串”,而string类型做不到 - 嵌套结构体(如
Address struct{ City string })在表单中要写成address.city,但Beego默认不解析这种点号嵌套,需手动展开
为什么RequestBody是空的
最常见原因是没在配置里开copyrequestbody = true。Beego默认不缓存原始请求体,this.Ctx.Input.RequestBody直接是nil或空切片。
性能与兼容性影响:
- 开启
copyrequestbody会额外分配内存拷贝整个body,大文件上传场景慎用 - 如果用了中间件(如JWT鉴权),且中间件已读过
Request.Body,后续控制器再读就是空的——Beego不自动重放流 - 微信支付回调等第三方服务,要求精确校验签名,必须用原始
RequestBody字节,不能经json.Unmarshal再json.Marshal来回折腾(会改变空白、顺序)


















