Buffalo路由参数需手动调用c.Param("key")获取字符串再转换类型,不支持自动结构体绑定;路径参数名严格匹配定义(如post_id),区分大小写,正则约束须写在路由路径中。

Buffalo 路由参数绑定靠 Context.Param(),不是自动结构体注入
Buffalo 不像 Gin 或 Echo 那样支持 c.Bind(&req) 直接解析 URL 参数到 struct。它的路由参数(如 /users/:id 中的 :id)必须显式调用 c.Param("id") 获取字符串,再手动转类型。这是新手最容易卡住的地方——以为写了 func UserShow(c buffalo.Context) error 就能自动拿到 id int,结果 c.Param("id") 返回的是空字符串或 panic。
-
c.Param("id")只在路径匹配成功后才有效;如果路由没注册:id段,或请求 URL 根本不匹配(比如访问/users/而不是/users/123),返回空字符串 - 必须自己做类型转换:
id, err := strconv.Atoi(c.Param("id")),别忘了检查err - 查询参数(
?page=2)要用c.Param("page")?错,得用c.Request().URL.Query().Get("page") - Body JSON 字段不能用
c.Param(),得用c.Request().Body手动解码,或借助c.Bind()(但需确保 Content-Type 是application/json且 struct tag 正确)
app.Resource() 自动生成的路由参数名是固定字符串,不是变量名
你写 app.Resource("/posts", PostsResource{}),Buffalo 会自动注册 GET /posts/:post_id 这类路由,但注意:参数名是 post_id,不是 id,也不是你 struct 里的字段名。这个命名规则由 Buffalo 内部约定,和资源名(Posts)强相关。如果硬要改成 :id,只能不用 Resource(),手写 app.GET("/posts/:id", PostShow)。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 默认 RESTful 资源路由参数名 = 单数资源名 +
_id(PostsResource→post_id,CommentsResource→comment_id) - 如果你的 handler 函数里写
c.Param("id"),永远拿不到值,必须用c.Param("post_id") -
app.Resource()不支持自定义参数名,也没法关掉它生成的冗余路由(比如你不需要PUT /posts/:post_id,但删了它整个资源注册就废了)
嵌套路由参数需要手动拼接,Buffalo 不支持多层 :id 自动识别
比如想匹配 /orgs/:org_id/projects/:project_id,Buffalo 的 app.GET() 能注册,但 c.Param("org_id") 和 c.Param("project_id") 都能取到——前提是路径定义里确实写了这两个 key。它不会自动把 /orgs/123/projects/456 拆成两个独立参数,而是严格按冒号后字符串匹配。容易出错的点在于:漏写某个 :,或者大小写不一致(Org_ID ≠ org_id)。
- 路径中每个
:xxx都算一个独立参数,c.Param("xxx")才有效 - 参数名区分大小写,
c.Param("OrgID")对应/orgs/:OrgID,不是/orgs/:org_id - 没有类似
chi.URLParam(r, "id")的泛型封装,每次都要写完整字符串键名 - 别指望
c.Params()返回 map——Buffalo 没这个方法,只有单个Param()
带正则约束的路由参数得用 app.GET("/items/:id([0-9]+)", ...),否则无效
Buffalo 底层用的是 Gorilla Mux,支持正则约束,但语法必须写在路径里,不能靠中间件或 handler 判断。比如只允许数字 ID,就得写 "/users/:id([0-9]+)";如果只写 "/users/:id",哪怕传入 /users/abc,路由照样匹配,c.Param("id") 返回 "abc",后面转 int 才 panic。
- 正则写错会导致整个路由不匹配(例如
:id(\d+)少了方括号,Gorilla Mux 会忽略该约束) - 约束只影响路由匹配阶段,不校验参数内容是否合法——比如
:id([a-z]{2,10})匹配/users/ab成功,但/users/a就 404 - 别在正则里用复杂表达式(如
.*),Buffalo 对路径解析较保守,可能触发意外 fallback 行为


















