在fiber中应直接用c.query()读取url查询参数,它自动解码且返回string;c.formvalue()对get查询参数无效,多值需用c.queries(),类型转换须检查error,如c.queryint("offset")。

如何在 Fiber 中正确读取 URL 查询参数
直接用 c.Query(),别用 c.FormValue() 或手动解析 c.Request().URL.RawQuery —— 后两者要么失效,要么漏掉编码处理。
c.Query() 的行为和边界情况
它底层调用 url.ParseQuery(),自动解码,但只读取第一份同名参数(遇到 ?id=1&id=2 只返回 "1")。需要多值时必须改用 c.Queries()。
-
c.Query("page")→ 返回 string,空值为"",不报错 -
c.Query("limit", "10")→ 提供默认值,当参数缺失时返回"10" -
c.Queries("tag")→ 返回[]string,支持?tag=a&tag=b - 若参数含特殊字符(如空格、中文),
c.Query()已自动url.PathUnescape,无需再调url.QueryUnescape
常见错误:把查询参数当成表单数据读
用 c.FormValue("q") 读 ?q=hello 会返回空字符串 —— 因为 FormValue 只解析 POST/PUT 请求体里的 application/x-www-form-urlencoded 或 multipart/form-data,对 URL 查询串完全无视。
- GET 请求的查询参数,只能用
c.Query()、c.Queries()、c.QueryInt()等 Query 系列方法 -
c.Body()或c.Request().Body对 GET 请求是空的,不能靠它捞查询参数 - 如果路由里写了
/:id,那是路径参数,和查询参数无关;?id=123仍需用c.Query("id")单独取
类型转换要小心默认值和错误处理
c.QueryInt("offset") 返回 (int, error),但很多人忽略 error,导致传入非数字时 panic 或静默出错。
- 推荐写法:
if offset, err := c.QueryInt("offset"); err == nil { /* use offset */ } else { /* handle parse failure */ } -
c.QueryFloat64("price")和c.QueryBool("active")同理,"true"/"false"才被识别为布尔,"1"不行 - 不要依赖
c.Query("limit", "20")的默认值做类型转换 ——c.QueryInt("limit", "20")是非法签名,Fiber 不支持带默认值的类型转换方法
Fiber 的查询参数读取逻辑很轻量,但陷阱藏在默认行为和类型方法的签名差异里。最常出问题的是混用 FormValue 和 Query,以及对多值、空值、类型错误的防御不足。











