c.params("name")是唯一正确方式,因路径参数与查询、表单参数来源完全隔离;c.query()只读query string,c.formvalue()只读请求体,二者对路径段内容无效。

c.Params("name") 是唯一正确方式,其他方法全无效
为什么不能用 c.Query() 或 c.FormValue() 取路径参数
路径参数(如 /user/:id 中的 id)和查询参数(?id=123)、表单字段完全隔离。Fiber 的 c.Query() 只解析 URL query string,c.FormValue() 只读请求体,二者对路径段里的内容视而不见。
常见错误现象:
-
路由定义为
app.Get("/post/:slug", handler),却在 handler 里写c.Query("slug")→ 返回空字符串 - 误以为
c.Params("Slug")能匹配:slug→ 大小写敏感,返回空 - 请求是
/post/abc/(末尾多斜杠),但路由只注册了/post/:slug→ 匹配失败,c.Params("slug")不会被调用
:name、*path、+path 和 ?optional 的行为差异
四类语法对应不同捕获逻辑,混用会出意料之外的结果:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
: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:声明可选参数,未提供时c.Params("optional")返回空字符串"",不是nil,需手动判空
多个参数怎么高效取值
别循环调 c.Params(),用 c.ParamsValues() 一次性获取:
- 路由为
/posts/:year/:month/:slug,直接写c.ParamsValues("year", "month", "slug")→ 返回[]string{"2024", "10", "how-to-use-fiber"} - 任意一个参数未匹配(比如请求是
/posts/2024),对应位置返回"",不会 panic - 不要调用
c.ParamsValues()(不带参数)→ 返回空切片,不是所有参数列表 - 参数名顺序不影响匹配,但传入顺序决定返回切片中元素的位置
类型转换和边界校验必须手动做
Fiber 不做任何自动转换或正则校验:
-
c.Params("id")永远返回string,哪怕 URL 是/user/123→ 需用strconv.Atoi()或uuid.Parse()手动转 - 想限制
:id只接受数字?Fiber 没内建机制 → 必须在 handler 里用regexp.MatchString(`^\d+$`, idStr)或strconv.Atoi检查,失败就return c.Status(400).SendString("invalid id") - 路径匹配是精确前缀:定义
/user/:id,请求/user/123abc会被匹配,但/user/123/extra不会 → 后者需要额外路由如/user/:id/*rest
最容易被忽略的是大小写敏感和末尾斜杠——这两个点一旦写错,c.Params() 就永远拿不到值,且无任何报错提示,只能靠日志或调试器逐段确认路由是否真正命中。










