必须用c.Params("name")取路径参数,其他方式为空;路径与查询参数严格隔离;:id、*path、+path、?optional语法行为不同;推荐c.ParamsValues()批量取值;匹配为精确前缀,大小写敏感且不自动转类型。

必须用 c.Params("name") 取,其他方式一律为空
路径参数和查询参数完全不互通
URL /user/123?tab=profile 中,123 是路径参数,tab=profile 是查询参数。Fiber 严格隔离二者:
-
c.Params("id")→ 返回"123"(前提是路由定义为/user/:id) -
c.QueryParam("id")或c.Query("id")→ 返回空字符串"",因为 query string 里根本没有id= - 反过来说,
c.Params("tab")也永远是空,tab不在路径段里
:id、*path、+path、?optional 的行为差异
不同语法捕获内容和返回格式不同,错用会导致取值异常:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
:id:只匹配单一段,不含/,如/posts/:year/:slug→c.Params("slug")得"hello-world" -
*path:捕获剩余全部路径,带前导/,如/files/*filepath匹配/files/a/b/c.txt→c.Params("filepath")得"/a/b/c.txt" -
+path:同*path,但不带前导/,更干净;注意不能嵌套,/a/+b/+c是非法路由 -
?optional:声明可选段,未提供时c.Params("optional")返回空字符串"",不是nil,需手动判空
多个参数一次性取值:用 c.ParamsValues(),别循环调 c.Params()
当路由含多个命名参数(如 /api/v1/:year/:month/:day),推荐直接用 c.ParamsValues():
-
c.ParamsValues("year", "month", "day")→ 返回[]string{"2024", "10", "05"} - 传入顺序决定返回切片顺序,参数名本身顺序无关
- 任一参数未匹配(比如请求是
/api/v1/2024缺 month/day),对应位置返回"",不会 panic -
c.ParamsValues()不带参数调用 → 返回空切片[]string{},不是所有参数列表
匹配边界和常见坑点
Fiber 的路径匹配是精确前缀匹配,没有模糊或正则回溯:
-
/user/:id能匹配/user/123abc(只要它是一段),但不匹配/user/123/extra(多出斜杠) - 末尾多一个
/就是不同路由:/user/123和/user/123/默认不互通,StrictRouting 开启时后者 404 - 参数名大小写敏感:
c.Params("ID")≠c.Params("id"),拼错就取不到 - 不自动类型转换:
c.Params("id")永远是string,数字需手动用strconv.Atoi等处理 - 内建无校验:想限制
:id必须是数字?得自己用regexp.MatchString或strconv.Atoi判错并返回响应
最常被忽略的是:路径参数必须在路由定义中显式声明,没写 :id 就永远取不到;以及 c.Params() 返回的字符串生命周期仅限 handler 内,若需跨函数使用,得用 utils.CopyString 或手动 copy 缓冲区。


















