GetString、GetInt等方法仅从query和form中提取参数,不解析JSON body;需开启copyrequestbody=true后用json.Unmarshal手动解析RequestBody。

GetString、GetInt 等方法只对 query 和 form 有效,不解析 JSON body
很多新手在用 Vue 或 Axios 发送 application/json 请求时,直接调用 GetString("xxx") 拿不到值——因为 Beego 的 GetString、GetInt 等方法默认只从 URL query string 和 POST 表单(application/x-www-form-urlencoded 或 multipart/form-data)中提取数据,**完全忽略原始 Request Body**。
解决办法是手动读取并反序列化:copyrequestbody = true 必须在 conf/app.conf 中开启,否则 this.Ctx.Input.RequestBody 为空;再用 json.Unmarshal 解析:
var req struct {
Name string `json:"name"`
Age int `json:"age"`
}
if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
this.Abort("400")
}
- 没开
copyrequestbody→RequestBody是空切片,Unmarshal必然失败 - 结构体字段首字母小写 → 反序列化后字段不会被赋值(Go 反射不可见)
- 前端发的是
text/plain或其他 Content-Type → 仍需手动读RequestBody,不能依赖GetString
ParseForm(&struct) 要传值类型变量的地址,不是指针变量的地址
ParseForm 看似简单,但最容易踩的坑是传参类型错误:它要的是 *Struct(结构体指针),但你得先定义一个值类型变量,再取它的地址;而不是定义一个指针变量,再对它取地址。
错误写法(导致字段全为零值,日志打印出 %!s(*string=0xc82027a368)):
n := &Note{} // n 是 *Note 类型
this.ParseForm(&n) // &n 是 **Note → 错!
正确写法:
n := Note{} // n 是 Note 值类型
this.ParseForm(&n) // &n 是 *Note → 对!
- 结构体字段必须首字母大写(导出),否则反射无法设置
-
formtag 必须与 HTMLname属性严格匹配(大小写敏感) - 如果字段 tag 写成
form:"-",该字段会被跳过,不参与绑定
Query、Param、Input().Get 三者来源不同,别混用
Beego 把请求参数按来源分了三类,各自独立缓存,不能互相替代:
-
this.Ctx.Input.Query("k")→ 只读 URL query 部分,如/user?id=123&name=foo中的id -
this.GetString(":id")或this.Ctx.Input.Param(":id")→ 只读路由路径参数,如/user/:id匹配到的123 -
this.Input().Get("k")→ 合并 query + form 数据,但**不包含 JSON body**,且同名 key 时 form 优先于 query
常见误用场景:
路由定义为 beego.Router("/api/user/:id", &c.UserController{}, "get:Get"),但代码里写 this.Ctx.Input.Query("id") → 拿不到,必须用 this.GetString(":id")。
又比如表单提交带 name="email",同时 URL 带 ?email=test@example.com,此时 this.Input().Get("email") 返回的是表单值,不是 query 值——这点容易被忽略。
复杂嵌套结构或数组参数,别指望 ParseForm 自动处理
ParseForm 仅支持扁平结构体,对 map、slice、嵌套 struct 的自动绑定能力非常弱。例如 HTML 表单里有多个同名 name="hobby" 输入框,ParseForm 不会自动聚合成 []string,而是只取最后一个值。
想拿到全部 hobby 值,得手动用:
hobbies := this.Ctx.Input.GetStrings("hobby") // 注意是 GetStrings,不是 GetString
对于嵌套字段(如 user[name]、user[age]),ParseForm 默认不识别方括号语法;Beego 也不原生支持类似 Rails 的嵌套参数展开。
- 需要嵌套绑定 → 改用 JSON body +
json.Unmarshal,更可控 - 需要多值数组 → 用
GetStrings显式获取,别依赖ParseForm - 混合 query + form + JSON → 没有统一 API,必须按来源分别处理


















