app.Get、app.Post、app.Use、app.Group各司其职:Get/Post注册具体HTTP方法路由,Use挂载前缀级中间件(对所有方法生效),Group创建带公共前缀的独立路由子树;StrictRouting默认开启,路径末尾斜杠影响匹配;c.Params、c.QueryParam、c.BodyParser数据源完全隔离;RESTful需统一复数资源名、显式声明占位符。

app.Get、app.Post、app.Use、app.Group这四个函数不是并列选项,而是各司其职的路由基建单元。搞混它们的职责,轻则404,重则中间件漏执行、参数永远取不到。
为什么/users和/users/都返回404?
Fiber 默认开启 StrictRouting: true,路径末尾斜杠是语义的一部分。注册了 app.Get("/users", h),只匹配 GET /users;/users/ 是另一条未注册的路由,自然 404。
别急着关 StrictRouting:设成 false 后,/users/123 可能被 /users 错误捕获,导致 c.Params("id") 拿不到值。
- 推荐做法:统一前端、OpenAPI、Postman 全部用无尾斜杠路径,后端只注册一种形式
- 若必须兼容,加个重定向中间件:
if strings.HasSuffix(c.Path(), "/") && c.Path() != "/" { c.Redirect(strings.TrimSuffix(c.Path(), "/"), 301) } - 上线前检查所有客户端调用路径是否一致,避免“本地能跑,线上404”
c.Params、c.QueryParam、c.BodyParser到底读哪来的数据?
三者来源完全隔离,混用必空值。参数名一样也不互通。
-
c.Params("id")只从路径占位符提取,如app.Get("/user/:id", h)匹配/user/123后才可取到"123";对/user?id=123或 JSON body 无效 -
c.QueryParam("q")只解析 URL query string,如/search?q=go→"go";不碰路径、header、body -
c.BodyParser(&v)是专为 JSON 设计的,要求Content-Type是application/json;若用application/x-www-form-urlencoded,得换c.FormValue("name")
URL 是 /user/123?format=json,那么 c.Params("id") == "123",c.QueryParam("format") == "json",两者互不干扰。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
立即学习“go语言免费学习笔记(深入)”;
app.Use 和 app.Group 的本质区别在哪?
app.Use 是前缀级中间件挂载,对所有 HTTP 方法生效;app.Group 是路由分组,创建带公共前缀的独立子树,但不自动拼接路径。
-
app.Use("/api", middleware)表示:所有以/api开头的请求(无论 GET/POST/PUT),都先过这个中间件;它不注册 handler,只是拦截 -
api := app.Group("/api")返回一个新*fiber.Router,后续api.Get("/users", h)实际注册的是GET /api/users—— 注意:路径里必须写全/users,不能省略前缀 - 常见错误:
api.Get("/api/users", h)→ 最终变成/api/api/users,多了一层 - 组内中间件(如
api.Use(auth))只影响该组下的所有路由,不影响根路由或其他组
RESTful 路由怎么组织才不容易翻车?
Fiber 不强制 RESTful,但你要手动按标准结构组织,否则资源语义混乱、前端调用错乱。
- 列表获取用
GET /todos,单条用GET /todos/:id,创建用POST /todos,更新用PUT /todos/:id,删除用DELETE /todos/:id - 资源名统一复数:
/todos就别混用/todo,OpenAPI 生成和 SDK 生成会出错 -
:id是占位符,不是字面量;c.Params("id")永远返回string,需用strconv.Atoi转整型,且必须检查错误 —— 否则/todos/abc会导致 panic - 避免
app.All("/api/*", ...)这类通配路由:它贪婪匹配,会覆盖后面注册的更具体路由(如/api/users/:id),且让中间件执行逻辑难以追踪
最常被忽略的一点:动态路由必须在注册时显式写出占位符,Fiber 不会从 URL 字符串里自动识别参数。没写 :id,c.Params("id") 就永远为空 —— 这不是 bug,是设计前提。


















