Beego中参数获取需按来源区分:Query用Input.Query(),路径参数用Input.Param()或GetString(),表单用Input.Get()系列(需copyrequestbody=true),JSON Body须手动json.Unmarshal;混用会导致取值失败或panic。

Beego 里参数不是统一用一个方法拿的,得看参数在哪、怎么传的——URL 查询串、路径段、表单体、JSON Body,各自有对应入口,混用会拿不到值甚至 panic。
Query 参数(?key=value 形式)用 Input.Query()
比如访问 /user?id=123&name=alice,这时参数在 URL 末尾的查询字符串里:
-
c.Input.Query("id")返回"123"(字符串),不自动转类型 -
c.Input.Query("name")返回"alice" - 如果 key 不存在,返回空字符串,不会报错
- 注意:
c.Ctx.Input.Param(":id")在这种场景下一定为空,因为 Param 只处理路径段里的冒号参数
路径参数(/user/:id 或 /user/:id:int)用 Input.Param() 或 GetString()
比如路由定义为 beego.Router("/user/:id", &controllers.UserController{}),请求 /user/456:
-
c.Ctx.Input.Param(":id")和c.GetString(":id")效果一样,都返回"456" - 若路由写成
/user/:id:int,Beego 会尝试做类型校验,但GetString仍返回字符串;要转整数得手动调c.GetInt(":id") - 别用
c.Input.Get("id"),它查的是 query,不是路径段 - 冒号是必须的,
":id"是完整 key 名,漏掉会返回空
Form 表单或 x-www-form-urlencoded 数据用 Input.Get() 系列
POST 提交普通表单时(非 JSON),参数在请求体里,但 Beego 默认不读取 body,需确认配置:
- 确保
conf/app.conf中有copyrequestbody = true,否则Input.Get拿不到值 -
c.Input.Get("username")拿第一个同名字段值(适合单值) -
c.GetStrings("hobby")拿所有hobby字段值(适合多选 checkbox) -
c.GetInt("age")返回(int64, error),务必检查 error,非法输入会失败 - 如果前端用
fetch发FormData,后端也走这条路;但若发的是 JSON,则不属于这个范畴
JSON Body 必须显式启用并手动解析
Beego 默认不解析 JSON 请求体,直接读 c.Ctx.Input.RequestBody 是原始字节,不能靠 Get 或 Query 拿到字段:
- 先在
app.conf开启copyrequestbody = true - 再用
json.Unmarshal(c.Ctx.Input.RequestBody, &structVar)解析 - 结构体字段必须首字母大写,且带
json:tag,否则反序列化失败(如Username string `json:"user_name"`) - 别试图用
c.GetString("xxx")去读 JSON 字段,它只处理表单和 query,对 JSON body 完全无效
最容易被忽略的是:同一个参数名出现在 query、path、form、body 多个位置时,Beego 不合并也不覆盖,每个入口互不干扰——你得清楚自己想从哪一层取,否则调试时会反复怀疑是不是框架 bug。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











