Buffalo 的 app.GET、app.POST 等方法直接对应标准 HTTP 动词 GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS;不支持 UPDATE、REMOVE 等别名或 SEARCH、CONNECT 等非主流动词,OPTIONS 必须显式注册,HEAD 与 GET 共享路由但不渲染 body。

Buffalo 的 app.GET、app.POST 等方法对应哪些 HTTP 动词?
Buffalo 路由直接映射标准 HTTP 方法,不额外抽象或缩写。它支持的动词就是你实际在浏览器或 curl 里用的那几个:GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS。没有 app.UPDATE 或 app.REMOVE 这类别名,也不支持 WebDAV 或 CONNECT 等非主流方法。
app.OPTIONS 必须显式注册,不能靠中间件自动处理
浏览器跨域请求前发的 OPTIONS 预检,Buffalo 不会自动响应。你必须手动写一条 app.Options("/api/*x", handler),否则预检失败,后续请求被静默拦截。
- 路径用
/api/*x可匹配所有子路径(如/api/users、/api/posts/123),但别用/*x匹配全局,避免把/admin也暴露出去 - handler 内只能设 header,不能调
c.Render()或c.Response().Write(),否则触发http: multiple response.WriteHeader calls - 返回
nil即可,Buffalo 默认返回 200;返回 204 或 404 会让 Safari 直接拒掉后续请求
HEAD 和 GET 共享同一 handler,但行为不同
Buffalo 默认把 HEAD 请求路由到同路径的 GET handler,但不会执行 c.Render() 的 body 渲染逻辑——它只走 header 设置和状态码返回。这意味着:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 如果你在
GEThandler 开头写了c.Response().Header().Set("X-Custom", "1"),HEAD请求也能拿到这个 header - 但
c.Render(200, r.JSON(data))在HEAD下只发 header,不序列化data,也不会报错 - 别依赖
HEAD做权限校验以外的事,比如它不会触发数据库查询(除非你手动写了)
自定义动词(如 SEARCH)需要绕过 Buffalo 路由注册
Buffalo 没有 app.SEARCH 或 app.PURGE 方法。若真要用非标动词,得退到底层:app.Mount(http.MethodSearch, "/search", http.HandlerFunc(yourHandler))。但要注意:
-
app.Mount注册的是原生http.Handler,拿不到buffalo.Context,无法用c.Render()、c.Param()等 Buffalo 特性 - 你得自己解析 URL、读 body、写 header、管理 session——等于放弃 Buffalo 的大部分便利
- 绝大多数场景下,用
POST /search或GET /search?q=xxx更稳妥,也更兼容 CDN 和代理
真正容易被忽略的是:Buffalo 的 app.Any() 方法虽存在,但它只是批量注册全部动词的语法糖,**不解决 OPTIONS 预检问题**——它照样不会自动回 200,照样要你手动处理预检逻辑。










