beego获取参数必须按来源手动调用对应方法:getstring/getint只读query和form,路由参数需param(":key");parseform仅适用post表单;json需启用copyrequestbody并手动unmarshal;所有方法区分大小写且须检查error。

Beego 获取请求参数不能靠“自动绑定”蒙混过关,必须分清来源(URL 查询、表单体、路由路径、原始 Body)并手动调用对应方法,否则 GetString("id") 可能拿错值、GetInt("age") 会静默返回 0、结构体绑定在 GET 场景下根本不起作用。
GetString/GetInt 等方法只读 query 和 form,不读路由参数
很多人以为 GetString("id") 能拿到 /user/123 里的 123,其实不能——它只查 URL 查询字符串(如 ?id=123)和 POST 表单数据(application/x-www-form-urlencoded)。路由参数(比如定义为 /user/:id)必须用 this.Ctx.Input.Param(":id") 单独取。
-
this.GetString("id")返回空字符串或默认值,即使路由里明明有:id - 若 URL 是
/user/123?name=alice,GetString("name")拿到alice,但GetString("id")拿不到123 - 若同时存在
?id=999和路由:id=123,GetString("id")仍只返回999,不会 fallback 到路由参数
ParseForm 绑定结构体仅适用于 POST 表单,且 tag 必须显式写
this.ParseForm(&u) 只解析 POST 请求的表单数据(Content-Type: application/x-www-form-urlencoded),对 GET 请求的查询参数、JSON Body 或路由参数完全无效。结构体字段名默认小写匹配表单 key,但一旦要自定义映射,就必须写 form:"xxx" tag。
- HTML 表单字段是
username,结构体字段叫Name,就得加Name string `form:"username"` -
form:"-"表示忽略该字段,不参与绑定 - 如果字段类型是
int但表单传了空字符串或非数字,ParseForm会失败并返回 error,不会静默设为 0 - GET 请求想批量取参?别指望
ParseForm,得手写GetString/GetInt链式判断
获取 JSON Body 需先开启配置,再手动 Unmarshal
Beego 默认不缓存原始请求体,直接读 this.Ctx.Input.RequestBody 会是空切片。必须在 conf/app.conf 中显式设置 copyrequestbody = true,否则 json.Unmarshal 总是失败。
- 配置项必须写在
[dev]或[prod]段下,全局段无效 - 读取后要检查
err:if err := json.Unmarshal(this.Ctx.Input.RequestBody, &ob); err != nil - 结构体字段必须首字母大写(Go 导出规则),且
jsontag 要与前端字段名一致,比如Username string `json:"user_name"` - 不要在控制器里重复写
RequestBody读取逻辑,建议封装成工具方法复用
容易被忽略的大小写和 error 处理细节
GetString 等方法全部区分大小写,GetString("Name") 拿不到 ?name=foo;所有带类型转换的方法(GetInt、GetBool)都返回 (value, error),但很多人只取第一个值,导致无法区分“参数没传”和“传了非法值”。
-
name := this.GetString("name")—— 若请求没带name,返回空字符串,你无从判断是用户故意传空还是漏传 - 正确写法:
name, err := this.GetString("name"); if err != nil { /* 参数缺失 */ } -
age, err := this.GetInt("age")对?age=abc返回0, err,不是0, nil;对?age=(空值)也返回0, err - 可选参数字段建议用指针类型(
*int),配合err才能真正区分“未提供”“提供为空”“提供为 0”
最麻烦的其实是混合场景:比如一个接口既要处理 GET /api/list?page=2&size=10,又要支持 POST /api/list 提交 JSON body。这时候不能只依赖一种方式,得按请求方法分流,各自用对应的取参逻辑,否则参数就悄悄丢进黑洞了。











