c.params("name")是唯一正确获取路径参数的方式;路径、查询、请求体参数来源严格分离,混用必为空;:name仅匹配单一段,*path/+path捕获剩余路径,?表示可选;大小写敏感,末尾斜杠导致404,返回值恒为string需手动转换。

c.Params("name") 是唯一正确方式,其他全错。Fiber 严格区分参数来源,路径参数、查询参数、请求体参数三者互不交叉,用错方法永远拿不到值。
路径参数必须用 c.Params(),别碰 c.Query()
比如路由定义为 app.Get("/user/:id", handler),那么只有 c.Params("id") 能取到 "123";c.Query("id") 永远返回空字符串,因为 /user/123 根本没有 query string。
- 命名大小写敏感:
c.Params("ID")≠c.Params("id"),拼错就取不到 - 末尾多斜杠会 404:
/user/123/不匹配/user/:id,除非你显式加通配符或开启StrictRouting: false - 返回值恒为
string:即使id是数字,也得手动转,例如strconv.Atoi(c.Params("id")) - 多个参数推荐用
c.ParamsValues("year", "month", "slug"),返回[]string,顺序与传入一致
:name、*path、+path、?optional 的行为差异
这四类语法不是可选写法,是语义完全不同的匹配规则:
-
:name:只匹配单一段,不含/,如/api/v1/:version中version只能是"v2",不能是"v2/users" -
*path:捕获剩余全部路径(含斜杠),返回值带前导/,例如/files/*filepath匹配/files/a/b/c.txt→c.Params("filepath") == "/a/b/c.txt" -
+path:同*path,但返回值不带前导/,更干净;注意它不支持嵌套写法,/a/+b/+c是非法路由 -
?optional:声明可选,但未提供时返回空字符串"",不是nil,需手动判空
查询参数和请求体参数别混进路径逻辑里
URL 查询参数(如 ?page=2&sort=desc)只能用 c.QueryParam("page") 或 c.Query("page");表单或 JSON 请求体里的字段,得用 c.FormValue("field") 或 c.BodyParser(&struct{})。
-
c.Params("page")在?page=2场景下永远为空 -
c.Query("id")在/user/:id场景下也永远为空 - 如果同时需要路径 ID 和查询页码,要分开取:
id := c.Params("id"),page := c.QueryParam("page") - Body 解析失败不会自动 fallback 到其他参数源,
c.BodyParser()报错后必须自己处理
最常被忽略的是匹配边界:Fiber 的路径参数是精确前缀匹配,不是正则模糊匹配。/user/:id 会匹配 /user/123abc,但不会匹配 /user/123/extra——后者需要额外定义 /user/:id/*rest 或独立路由。内建无校验,想限制 :id 必须是数字,就得在 handler 里手动检查。











