Buffalo路由仅支持app.Resource()和app.GET()/app.POST()两种明确方式:简单API用显式路由,复杂REST用Resource;特殊路由需WrapHandler;路由注册唯一起点是routes/app.go的app.Routes()。

Buffalo 不支持“自定义路由”这种模糊概念——你只能选择两种明确路径:用 app.Resource() 走约定式 REST,或用 app.GET()/app.POST() 等基础方法写显式路由。没有第三种“灵活又自动”的中间态。
想暴露一个简单 API 接口,别碰 Resource
如果你只是要一个 GET /api/health 或 POST /webhook,app.Resource() 是过度设计:它会硬塞进事务中间件、模板渲染逻辑、7 个 HTTP 方法绑定,还要求你建一堆配套文件。
直接在 routes/app.go 的 app.Routes() 函数里加:
app.GET("/api/health", func(c buffalo.Context) error {
return c.JSON(200, map[string]string{"status": "ok"})
})
-
app.GET()必须写在app.Use(...)之后、app.ServeFiles()之前,否则中间件不生效或被静态路由吞掉 - 函数签名必须是
func(c buffalo.Context) error,返回非 nil error 会触发 500 - 不要在 handler 里手动调
c.Response().WriteHeader(),用c.JSON()/c.Render()等封装方法
需要精确控制路径和方法,就用 app.GET/app.POST 等原语
app.Resource("/users", UsersResource{}) 是黑盒:它自动把 GET /users 映射到 UsersResource.List,但你没法改这个映射关系,也不能给其中某条路由单独加中间件。
立即学习“go语言免费学习笔记(深入)”;
当你要:
- 同一个路径下不同 method 走不同 handler(比如
PUT /orders和PATCH /orders分开处理) - 路径带变量但不用 Resource 的复数规则(比如
GET /v1/user/:id/profile) - 某个路由绕过日志中间件但其他不绕过
就该写:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
api := app.Group("/v1")
api.GET("/user/{id}/profile", UserProfileHandler)
api.PUT("/orders", OrdersUpdateHandler)
api.PATCH("/orders", OrdersPartialUpdateHandler)
Group() 只是路径前缀拼接,不是嵌套路由;所有注册最终都扁平落在根 router 上。
Swagger、WebSocket 这类特殊路由必须用 WrapHandler
Buffalo 的路由系统只认 buffalo.Handler 类型,而 Swagger UI、WebSocket Upgrader 等第三方库提供的是标准 http.Handler。直接传进去会编译报错:cannot use ... as type buffalo.Handler。
必须用 buffalo.WrapHandler() 包一层:
import "github.com/swaggo/http-swagger"
app.GET("/swagger/*any", buffalo.WrapHandler(httpSwagger.WrapHandler()))
- 路径必须带
/*any,否则子资源(如/swagger/index.html)404 -
docs/docs.go必须被main包 import,否则编译时整个 docs 包被丢弃 - WebSocket 同理:
app.GET("/ws", buffalo.WrapHandler(upgrader.Upgrade)),且该路由不能挂任何中间件(会提前写 header 导致 Upgrade 失败)
别在 actions/ 目录里写 app.GET
routes/app.go 是唯一可信的路由注册入口。你在 actions/users.go 里写 app.GET(...) 完全无效——app 实例没传过去,调用的是个临时对象,对实际路由树零影响。
常见 404 原因就是把路由写错了地方。确认方式只有两个:
- 运行
buffalo routes,看输出里有没有你的路径 - 检查是否修改了
routes/app.go中的app.Routes()函数体
框架不会扫描注释、配置文件或未注册的函数名来生成路由——没出现在 app.Routes() 里的,就等于不存在。


















