beego中必须在路由定义中显式声明:id等占位符,this.ctx.input.param(":id")或this.getstring(":id")才可获取路径参数;若路由未含占位符(如/user),则返回空字符串;类型约束(如:id:int)和正则匹配决定是否进入控制器,不匹配直接404。

直接用 this.Ctx.Input.Param() 或 this.GetString(),但必须确保路由定义里声明了带冒号的占位符(如 :id),否则拿不到值。
路由没写对,Param 一定返回空
Beego 不会自动从 URL 路径中“猜”参数名。比如访问 /user/123,但路由注册是 beego.Router("/user", &UserController{}),那 this.Ctx.Input.Param(":id") 就永远是空字符串。
- 正确写法:路由必须显式包含占位符,例如
beego.Router("/user/:id", &UserController{})或带正则的beego.Router("/user/:id([0-9]+)", &UserController{}) - 如果用了
AutoRouter,路径形如/user/Get/123,参数索引是数字,取法是this.Ctx.Input.Param("0"),不是:id - 别把
Query和Param混用:this.Ctx.Input.Query("id")是读?id=123,和路径无关
GetString 和 Param 的区别在哪
两者在获取路径参数时行为一致,但语义和类型安全不同:
-
this.Ctx.Input.Param(":id")返回string,原始值,不做类型转换 -
this.GetString(":id")也是返回string,但它是Controller提供的快捷方法,底层调的还是Param - 需要转整数?直接用
this.GetInt(":id"),它内部调Param再strconv.ParseInt,失败返回 error —— 别自己手动strconv - 注意 key 名必须带冒号:
":id",写成"id"或"id:"都拿不到
正则约束和类型后缀会影响匹配结果
路由里的正则或类型声明不只是校验,还决定请求是否能进控制器:
-
beego.Router("/post/:id:int", &PostController{})→ 只匹配/post/42,不匹配/post/abc,匹配失败直接 404 -
beego.Router("/file/:name([\w.]+)", &FileController{})→ 支持下划线、点号,但不支持斜杠,/file/a/b.txt会失败 -
beego.Router("/download/*.*", &DownloadController{})→ 匹配成功后生成两个参数::path和:ext,分别对应file/api和xml
最容易被忽略的是:路径参数的 key 名必须和路由定义中完全一致(包括冒号),且大小写敏感;另外,Param 只在路由匹配成功后才可用,没匹配上时调用它不会报错,但返回空字符串 —— 这会让调试变得隐蔽。











