GET参数必须用c.QueryParam()而非c.FormValue(),因后者仅读POST表单数据;路径参数需路由显式声明如/user/:id;JSON用BodyParser,表单用FormValue,文件上传用FormFile,各API严格对应来源。

GET参数必须用c.QueryParam(),不是c.FormValue()
GET参数在URL查询字符串里(如/search?q=go&page=2),Fiber不把它当表单数据处理。用c.FormValue("q")永远返回空字符串——它只读POST请求体里的application/x-www-form-urlencoded内容。
正确做法是统一用c.QueryParam("q"),它自动解码URL编码、对缺失key返回空字符串(不会panic),比c.Query()更安全。
- 需要默认值?写
c.QueryParam("page", "1") - 要取所有同名参数(如
?tag=a&tag=b)?用c.Queries()["tag"],返回[]string - 别把路径参数和查询参数混用:
/user/:id?page=2中c.Params("id")和c.QueryParam("page")互不影响
POST表单数据必须先调c.BodyParser()或c.FormValue(),但不能混用
POST请求分三类:JSON、标准表单(application/x-www-form-urlencoded)、文件上传(multipart/form-data)。Fiber不自动识别类型,你得按Content-Type选对方法。
如果是JSON(Content-Type: application/json),直接c.BodyParser(&v),注意v必须是指针;字段要带json:"field" tag,否则解析失败且无报错。
立即学习“go语言免费学习笔记(深入)”;
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
如果是标准表单(HTML <form></form> 默认提交方式),用c.FormValue("username")——它等价于c.PostFormValue(),只读POST部分,对GET请求无效。
-
c.FormValue()对不存在的字段也返回空字符串,不用额外判空 - 想取多个同名值(如复选框),用
c.FormValue("hobby")只拿第一个,c.Form()["hobby"]返回[]string - 千万别在JSON请求里用
c.FormValue()——Body已被BodyParser读过一次,再读就是空字节
路径参数c.Params()必须路由显式声明,否则永远为空
Fiber不会从URL字符串里“猜”路径参数。写app.Get("/user/:id", handler)才能用c.Params("id")拿到123;写成/user/{id}、/user/:id/或/user/:id但请求是/user/123/(尾斜杠),都会返回空字符串。
StrictRouting开启时,/user/123和/user/123/是两条不同路由,匹配失败就404,不会自动跳转或截断。
-
c.Params("id")返回的是内部字节切片引用,不能存到map或结构体字段长期使用——高并发下可能读到下一个请求的值 - 通配符写法是
app.Get("/files/*", handler),取值用c.Params("*"),不是c.Params("star") - 别和
c.QueryParam("id")混淆:一个是/user/123,一个是/user?id=123
文件上传必须用c.FormFile(),不能靠c.Body()手动读
当表单设了enctype="multipart/form-data",Fiber不会自动解析文件字段。此时c.FormValue()只能取文本字段,文件必须用c.FormFile("avatar")获取*multipart.FileHeader,再调c.SaveFile()保存。
如果试图用c.Body()读整个请求体,会破坏multipart解析状态,后续c.FormFile()一定失败,且无明确错误提示。
-
c.FormFile()返回nil, error,必须检查error,不能只判file是否为nil - 文件名来自客户端,不可信;保存前务必清理路径,避免
../遍历攻击 - 大文件上传需配合
app.Config().DisableKeepalive = true或反向代理超时设置,否则连接可能被中断

















