Buffalo纯JSON接口需精简路由:删除templates/和public/目录,移除session、CSRF等中间件,用c.JSON()替代c.Render(),显式注册GET路由,保留middleware.Defaults(),避免静默降级。

Buffalo 的路由系统默认面向全栈 MVC 场景,直接用 buffalo generate resource 或 c.Render() 会带出模板、CSRF、session 等冗余逻辑——如果你只想要一个干净的 JSON 接口,必须手动剥离这些层,否则请求会卡在中间件里返回 403、500 或空响应。
删掉模板和静态文件相关代码
Buffalo 启动时会自动加载 templates/ 和 public/,哪怕你没写 HTML,只要目录存在,r.HTML() 就可能被隐式调用,导致 c.JSON() 失效。最稳妥的做法是彻底移除它们:
- 删除整个
templates/目录(否则r.Auto(c, data)可能 fallback 到 HTML 渲染) - 删除
public/和assets/目录(避免app.ServeFiles()注册静态路由干扰 API 路径) - 注释或删除
app.Use(cookies.Secure())、app.Use(csrf.New())、app.Use(session.Middleware())—— 这些对纯 API 完全无用,且会因缺少 session store 导致 panic
用 c.JSON() 替代 c.Render() + r.HTML()
Buffalo 的 c.Render() 是多态的,它会根据 r.Auto() 或显式类型判断输出格式;但默认行为依赖模板引擎。要确保只走 JSON 流程,必须绕过渲染器抽象:
- 不要写
return c.Render(200, r.JSON(data))—— 这仍经过render.Renderer链,可能触发未初始化的 template loader - 改用
return c.JSON(200, data),这是 Buffalo 提供的快捷方法,底层直接调用json.Marshal并设 Content-Type - 如果需要自定义状态码或 header,用
c.Response().WriteHeader()+json.NewEncoder(c.Response()).Encode()更可控
示例:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
func UsersHandler(c buffalo.Context) error {
users := []map[string]string{{"id": "1", "name": "alice"}}
return c.JSON(200, users)
}
注册路由时不走 Resource 自动生成
app.Resource("/users", UsersResource{}) 会绑定 7 个 RESTful 路由并挂一堆中间件(如 pop.Transaction),而你只是想暴露一个 GET /api/users。应该用显式 app.GET():
- 在
app.go中,把app.Resource(...)全部删掉 - 改用
app.GET("/api/users", UsersHandler)—— 路径前缀可自由定,不强制 REST - 避免在 handler 中调用
c.Param("id")以外的c.Param(),Buffalo 的参数解析在无模板时偶尔会 panic - 如果要用 POST 解析 JSON body,确保已启用
app.Use(middleware.Defaults(app))(它包含middleware.RequestID和middleware.BodyParser),否则c.Request().Body是空的
启动前确认中间件链已精简
运行 buffalo dev 时,Buffalo 默认插入至少 5 层中间件(包括 logger、request ID、transaction、session、csrf)。即使你没配 DB 或 session,pop.Transaction 和 session.Middleware 仍会执行并报错。检查 app.go 中的 app.Use() 调用:
- 保留
middleware.Defaults(app)(提供基础解析和日志) - 移除
pop.Transaction(app.DB)(BFF 或纯 API 不该碰 DB) - 移除
session.Middleware()和csrf.New()(无 cookie/session 场景下必崩) - 如果用
app.Options()处理 CORS,别用middleware.CORS()—— 它默认开启 credentials,会导致前端 preflight 失败;改用手写 middleware 或用github.com/rs/cors
精简后,app.Use() 应只剩 1–2 行,启动日志里中间件列表明显变短,HTTP 延迟下降 30%+。
真正麻烦的不是写路由,而是 Buffalo 在你删掉一个目录或注释一行 app.Use() 后,不会明确报错,而是静默降级到某个 fallback 行为——比如模板缺失时尝试渲染空字符串,JSON 接口返回 200 但 body 为空。建议每次删减后,用 curl -v http://localhost:3000/api/users 直接测 raw response body,别依赖浏览器或 Postman 的“漂亮视图”。


















