beego路由配置分函数式和控制器式:函数式用beego.get/post等,路径无参、签名固定为func(*context.context);控制器式用beego.router绑定controller,支持参数提取、正则校验及方法映射;路由按注册顺序覆盖,控制器式优先级高于函数式;参数须用ctx.input.param(":key")获取,注册须在web.run()前完成。

Beego 的基础路由配置有两条主线:函数式注册和控制器式注册,选错方式会导致路由不生效或方法无法调用。
直接用 beego.Get、beego.Post 等函数注册路由
这是最轻量、最直观的方式,适合原型开发或简单接口。每个 HTTP 方法对应一个独立函数,不依赖 Controller 结构。
- 必须导入
"github.com/beego/beego/v2/server/web/context",否则context.Context类型报错 - 函数签名固定为
func(ctx *context.Context),不能少星号或换类型 - 路由路径不支持参数提取(如
/user/:id),只能写死路径;若需参数,得切到beego.Router方式 - 示例:
beego.Get("/health", func(ctx *context.Context) { ctx.Output.Body([]byte("ok")) })
用 beego.Router 绑定 Controller 实现方法分发
这是 MVC 风格的主流用法,URL 路径映射到 Controller 实例,HTTP 方法自动触发对应方法(如 GET → Get())。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- Controller 必须嵌入
web.Controller,否则方法不会被识别 - 路径末尾带
?(如/api/?:id)表示参数可选;不带则强制要求参数存在,否则 404 - 类型约束写法如
:id:int或:id([0-9]+)会做正则校验,匹配失败直接跳过该路由(不是报错,而是继续往下匹配) - 第三个参数为空字符串时启用默认方法映射;填
"get:List;post:Create"则可自定义 method→func 映射
路由注册顺序和覆盖问题
Beego 按代码执行顺序注册路由,后注册的会覆盖前面同路径、同 method 的路由 —— 这不是 bug,是设计行为。
- 比如先写
beego.Get("/user", handlerA),再写beego.Get("/user", handlerB),最终生效的是handlerB - 更隐蔽的是
beego.Router("/user", &UserCtrl{})和beego.Get("/user", ...)同时存在时,前者优先级更高(因它注册了整个路径的 controller 分发逻辑) - 调试建议:启动时加
beego.BeeLogger.Level = logs.LevelDebug,看日志里是否打印出你预期的路由条目
参数获取必须用 ctx.Input.Param,别用 Query 或 Form
路径参数(如 /user/:id 中的 :id)和通配符(如 *splat)只能通过 ctx.Input.Param(":id") 获取,ctx.Input.Query 或 ctx.Input.Param("id")(漏掉冒号)都拿不到。
-
:id、:splat、:path、:ext是 Beego 内置关键字,冒号不能省 - 如果用了
:id:int但请求传了字符串,参数值为空字符串,不会 panic,也不会自动转成 0 —— 业务层要自己判空或转换 - 多个参数如
/user/:uid/:action,必须分别调用ctx.Input.Param(":uid")和ctx.Input.Param(":action")
最容易被忽略的是:路由注册必须在 web.Run() 之前完成,且不能放在某个条件分支里(比如 if debug == true),否则上线环境根本不会加载。另外,所有路由代码应统一放在 routers/router.go 中初始化,避免散落在 main 函数或 controller 文件里导致维护困难。










