buffalo generate resource生成的代码默认面向服务端渲染,需手动将c.Render()替换为c.JSON()、清理csrf/session中间件、补全json tag、使用app.Group("/api/v1")分层注册路由并同步调整中间件链。

buffalo generate resource 生成的代码默认不是 API 友好的
它直接面向服务端渲染(HTML + 模板),所以生成的 actions/users.go 里全是 c.Render(),模板路径硬编码在调用里。你一删 templates/users/ 目录,GET /users 就 panic 报 template:"users/index.html" is undefined。这不是路由没注册,是 Buffalo 的 Render 方法强制查模板文件。API 场景下必须手动替换,不能跳过。
所有 c.Render() 必须替换成 c.JSON()
替换不是简单全局搜索替换,要注意返回状态码和数据结构:
-
c.Render(200, r.HTML("index", users))→c.JSON(200, users)(注意:users 是[]User切片) -
c.Render(200, r.HTML("show", user))→c.JSON(200, user)(user 是单个 struct) -
c.Render(201, r.HTML("show", user))(Create)→c.JSON(201, user) -
c.Render(204, r.String(""))(Destroy)→c.NoContent(204)或c.JSON(204, nil)
别漏掉 models/user.go 里的 JSON tag:确保字段有 json:"name",否则 c.JSON() 输出空字段。
中间件链必须清理,否则 POST/PUT/DELETE 全挂
Buffalo 默认加了 session.Middleware、csrf.Middleware 和 pop.Transaction。API 场景下:
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
-
csrf.Middleware会拦截所有非 GET 请求,要求 header 带X-CSRF-Token,前端不传就 400; -
session.Middleware强依赖 cookie,跨域时失效,还可能因无 session store 报错; -
pop.Transaction可保留(对 DB 操作有用),但要确认它没被其他中间件依赖。
改法:在 app.go 的 app.Use(...) 链里删掉前两项,或为 API 路由单独建 group 并绕过它们,比如:
api := app.Group("/api/v1")
api.Use(popmw.Transaction(models.DB))
api.Resource("/users", &UsersResource{})
路由前缀和资源注册要显式分层
别直接用 app.Resource("/users", &UsersResource{}),这会让 API 和 HTML 路由混在一起,后续难维护。正确做法是:
- 用
app.Group("/api/v1")显式隔离版本; - 注册时写
api.Resource("/users", &UsersResource{}); - 确保
UsersResource的 handler 全部已按前面两步改完(JSON + 无中间件干扰)。
这一步容易被忽略:如果只改了 handler 但没换路由组,CSRF 依然生效;如果换了组但忘了删中间件,还是 400。两个动作必须同步做。
















