fiber 中需用 c.bodyparser(&user) 显式解析 json 请求体,传结构体地址;路径参数用 c.params("id"),查询参数用 c.query("page");设状态后须 return 防覆盖;中间件中不调 next(c) 可终止流程。

怎么在 Fiber 里正确读取 JSON 请求体
直接用 c.Body() 拿到的是原始字节,不是解析好的结构体。Fiber 不会自动帮你反序列化,必须显式调用 c.BodyParser() 或手动 json.Unmarshal()。
常见错误是写成:c.BodyParser(&v) 却忘了 v 是指针 —— 必须传地址,否则解析失败且无报错(v 保持零值)。
- 使用场景:POST/PUT 接收
application/json数据 - 推荐写法:
err := c.BodyParser(&user),其中user是 struct 变量名,前面带& - 如果解析失败,
err通常是json.Unmarshal错误(比如字段类型不匹配、缺少json:tag),不是 HTTP 400 自动返回 - 别依赖中间件自动做这事 —— Fiber 默认不注册 JSON 解析中间件,
BodyParser是按需调用的
Fiber 路由参数和查询参数怎么区分取值
:id 是路径参数,?page=2 是查询参数,两者底层来源不同,API 也完全不重叠。
- 路径参数用
c.Params("id"),注意字符串返回,需手动转类型(如strconv.Atoi) - 查询参数用
c.Query("page"),同样返回 string;想默认值就用c.Query("page", "1") - 如果 URL 是
/users/:id?format=json,c.Params("id")拿123,c.Query("format")拿json,互不影响 - 别把
c.Params当成万能取参函数 —— 它对 query、body、header 都无效
为什么 c.Status(404).SendString("not found") 有时不生效
因为 Fiber 的链式调用不是“立即响应”,而是构建响应上下文;如果后续代码又调了 c.JSON() 或 c.Send(),前面的 Status 就会被覆盖。
- 典型踩坑:在 if 分支里写
c.Status(404).SendString(...),但没加return,接着执行了后面的c.JSON(...) - 正确做法:每次手动设状态后,显式
return,或统一用c.Status(404).JSON(map[string]string{"error": "not found"}) -
SendString和JSON都会自动设置 Content-Type,但不会覆盖已写的 Status —— 前提是没被后续响应覆盖 - 调试时可加
fmt.Println(c.Response().StatusCode())确认最终状态码
Middleware 里如何提前终止请求(比如鉴权失败)
Fiber 中间件不靠 return 终止流程,而靠是否调用 next(c) —— 不调它,后续 handler 就不会执行。
- 鉴权失败时,直接写
c.Status(401).SendString("unauthorized"),然后return,别调next(c) - 千万别写
next(c); return—— 这样即使你刚写了 401,后续 handler 还会跑,可能重复响应 - 中间件函数签名必须是
func(c *fiber.Ctx) error,哪怕你不返回 error,类型也不能错(否则编译不过) - 全局中间件(
app.Use())和路由级中间件(app.Get("/", middleware, handler))行为一致,终止逻辑相同
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











