Buffalo不支持嵌套路径参数,仅识别最后一个{name};需用通配符/api/*x捕获完整子路径,再手动切分c.Param("x")并校验长度、处理空段及类型转换。

Buffalo 的 {id} 不支持嵌套路径参数
Buffalo 的路由参数解析只认单层命名段,比如 /users/{id} 中的 {id} 能被 c.Param("id") 拿到,但 /api/v1/users/{id}/posts/{post_id} 这种写法虽然能注册成功,c.Param("post_id") 却始终为空——因为 Buffalo 默认不递归解析多级花括号,它只把最后一个 {xxx} 当作参数,前面的全当静态路径处理。
app.Get("/api/*x", handler) 是捕获多级路径的唯一可靠方式
想真正拿到 /api/v1/users/123/posts/456 里所有段,必须用通配符 *x,再手动拆解 c.Param("x") 的值。这个 x 是固定键名,不是你随便起的。
-
c.Param("x")返回的是完整子路径字符串,比如"v1/users/123/posts/456" - 用
strings.Split(c.Param("x"), "/")手动切分,再按位置取值(注意首项常为空) - 别在 handler 开头就
return c.Render(200, nil)—— 通配符路由不会自动校验路径合法性,得你自己判断切分后长度是否足够 - 如果需要类型转换(如把
"123"转成int),必须显式调用strconv.Atoi(),Buffalo 不做任何隐式转换
为什么不用正则或自定义匹配器
Buffalo 内置路由引擎不支持正则表达式语法(如 /users/{id:[0-9]+}),也没有 app.GetRegexp() 这类扩展接口。社区曾有 PR 尝试加入,但因破坏约定优于配置原则被拒绝。所以硬需求只能靠 *x + 字符串处理,或者前置加一层中间件做路径重写(比如把 /api/v1/users/123 改成 /api/users/123?version=v1),但这会增加调试复杂度。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
容易被忽略的边界情况
通配符 *x 会贪婪匹配,/api/*x 同时匹配 /api/、/api/a、/api/a/b/c/d。如果你只想要两级,必须在 handler 里检查 len(strings.Split(c.Param("x"), "/")) == 2;若路径末尾带斜杠(如 /api/v1/),c.Param("x") 会是 "v1/",切分后最后一段为空——这个空字符串很容易被当成有效 ID 导致数据库查询失败。










