fiber路由通过显式调用app.get()、app.post()等方法注册,需严格匹配路径(含末尾斜杠)、正确使用c.params()/c.queryparam()/c.formvalue()区分参数来源,app.use()为全方法前缀匹配中间件,strictrouting默认开启影响路径精确匹配。

app.Get()、app.Post()这些方法就是路由处理的入口
Fiber 的路由处理不靠注解或自动扫描,所有路径绑定都靠显式调用 app.Get()、app.Post() 这类方法完成。它们接收三要素:HTTP 方法、带前导斜杠的路径字符串、一个 func(*fiber.Ctx) error 类型的 handler。
常见错误现象:
- 路径写成
"users"(缺开头/)→ 永远 404 - handler 忘了
return→ Go 编译报错missing return at end of function - 注册了
app.Get("/users", h),但请求发的是/users/→ 404(StrictRouting 默认开启)
正确写法示例:
app.Get("/posts/:id", func(c *fiber.Ctx) error {
id := c.Params("id") // 只有路由里写了 :id,这里才能取到
return c.SendString("post " + id)
})
c.Params()、c.QueryParam()、c.FormValue() 各管各的,混用就为空
参数不是“自动归类”的,Fiber 明确划分三类来源,内存地址完全隔离:
-
c.Params("id"):只读路由路径中声明的占位符,比如/user/:id中的:id -
c.QueryParam("format"):只读 URL 查询串,比如?format=json -
c.FormValue("name"):只读application/x-www-form-urlencoded表单字段
如果 URL 是 /user/123?format=json,那么:
-
c.Params("id")→"123" -
c.QueryParam("format")→"json" -
c.Params("format")或c.QueryParam("id")→ 都是空字符串
别用 c.FormValue() 去读 JSON 请求体——它会返回空,且可能破坏 multipart 解析状态。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
app.Use() 是全方法中间件,不是“只处理 GET”
app.Use() 注册的处理器对所有 HTTP 方法生效,底层会把同一份路由复制进 GET、POST、PUT 等全部方法栈。它匹配的是前缀,不是子串:
-
app.Use("/api")→ 匹配/api、/api/users、/api/v1/posts/123 -
app.Use("/api")→ 不匹配/apixxx(后面不是/或结尾) -
app.Use("/api")→ 也不匹配/v1/api/users(没以/api开头)
注意:app.Use("/api", subApp) 是挂载子应用的标准方式,但 subApp 内部的路由仍需自己写前缀,比如 subApp 里写 Get("/users"),最终访问路径是 /api/users,不是 /users。
StrictRouting 开启时,/users 和 /users/ 是两条独立路由
这是最容易被当成 bug 的设计点。默认 StrictRouting: true 意味着路径末尾斜杠参与精确匹配:
- 只注册了
app.Get("/users", h)→GET /users✅,GET /users/❌(404) - 只注册了
app.Get("/users/", h)→GET /users/✅,GET /users❌
关掉 StrictRouting 虽能“兼容”,但会引发歧义:若同时注册了 /users 和 /users/:id,/users/123 可能被前者捕获。更稳妥的做法是显式重定向或双注册,而不是依赖宽松匹配。
真正容易被忽略的是:c.Params() 返回的是内部字节切片引用,不是新分配字符串。把它直接传给 goroutine 或存进 map,下个请求进来时值就变了。










