Fiber中POST路由需手动匹配Content-Type:JSON用c.Struct或c.BodyParser,表单需c.ParseForm后c.FormValue,文件上传需c.ParseMultipartForm;handler必须返回error且不可panic。

直接用 app.Post() 注册路由,但请求体解析必须手动匹配 Content-Type,否则 c.FormValue、c.Struct 或文件读取都会拿不到数据。
POST 路由注册和 handler 基本写法
签名必须是 func(*fiber.Ctx) error,且结尾要 return nil 或显式错误。漏掉 return 会导致响应中断或空返回。
-
app.Post("/login", func(c *fiber.Ctx) error { ... return nil })是最简形式 - 路径支持参数,如
/user/:id,取值用c.Params("id")(字符串,需自行转类型) - 别在 handler 里调
log.Fatal或panic——Fiber 靠返回 error 触发统一错误处理 - 若用中间件鉴权失败,直接
return c.Status(401).SendString(...),别调next(c)
Content-Type 不匹配导致读不到数据
c.FormValue("key") 只对 application/x-www-form-urlencoded 和 multipart/form-data 有效;发的是 JSON 却用它读,结果一定是空字符串。
-
application/json:用c.Struct(&v)(推荐)或c.BodyParser(&v),v必须是指针 -
application/x-www-form-urlencoded:先调c.ParseForm(),再用c.FormValue("username") -
multipart/form-data(含文件):先调c.ParseMultipartForm(32 (32MB 限制),再用 <code>c.FormValue或c.FormFile("avatar") - 其他类型(如
text/plain):只能用c.Body()拿原始字节,Fiber 不自动解码
文件上传常见卡点
c.FormFile("file") 只返回元信息(Filename、Size 等),不包含内容。很多人上传后发现文件为空,就是因为没打开文件流。
- 单文件:拿到
file, _ := c.FormFile("avatar")后,必须f, _ := file.Open(),并记得defer f.Close() - 多文件:用
form, _ := c.MultipartForm(),然后遍历form.File["images"] - 别把
c.FormFile当成“读取文件内容”的函数——它只是个描述符
状态码和响应覆盖问题
Fiber 的 c.Status(400) 不会自动终止流程,后续若又调 c.JSON() 或 c.SendString(),前面的状态码可能被覆盖。
- 分支逻辑中设状态后,必须
return,例如:if err != nil { return c.Status(400).JSON(...) } - 不要写成
c.Status(400).JSON(...); c.JSON(...)—— 第二个会覆盖状态和响应体 - 调试时可用
fmt.Println(c.Response().StatusCode())确认最终返回的状态码
最容易忽略的是:Fiber 默认不解析任何请求体,所有解析动作(ParseForm、Struct、FormFile)都得你主动触发;而且 c.Params、c.Query、c.FormValue、c.Body() 四者完全不互通,用错位置就拿不到值。


















