c.params() 返回空字符串主要有两种原因:一是路由未声明参数(如误用花括号或末尾多斜杠),二是请求路径未匹配路由(如strictrouting开启时尾斜杠不一致);取值需确保参数名大小写一致,且区分路径参数与查询参数。

c.Params() 返回空字符串,基本就两种原因:路由没声明参数,或请求路径根本没匹配上。
路由定义漏了冒号或写错格式
路径参数不是自动识别的,必须在路由字符串里显式用 :name 声明。写成 /user/{id} 或 /user/:id/(末尾多斜杠)都会导致 c.Params("id") 拿不到值。
-
app.Get("/user/:id", handler)→ 请求/user/123时c.Params("id")是"123" -
app.Get("/user/{id}", handler)→ 404,Fiber 不识别花括号语法 -
app.Get("/user/:id/", handler)→ 请求/user/123/才能命中;/user/123会 404(StrictRouting 默认开启) - 通配符
*必须在末尾:/files/*path合法,/files/:id/*path启动直接报invalid pattern
请求路径和注册路由不一致
StrictRouting 开启时,/users 和 /users/ 是两条完全不同的路由。前端发了带尾斜杠的请求,但你只注册了无斜杠版本,c.Params() 就永远为空。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 检查实际请求路径是否与
app.Get()中写的完全一致(包括大小写、斜杠、空格) - 用
c.Path()打印当前匹配到的原始路径,确认它是不是你预期的那个 - 别关
StrictRouting: false来“绕过”,这会让/user/123被错误地匹配到/user这条路由上 - 更稳妥的做法是加一层重定向中间件,把结尾斜杠统一去掉再 301 跳转
取值方式和参数名不匹配
c.Params("id") 和 c.QueryParam("id") 完全无关。路径里没写 :id,却去查 c.Params("id"),结果必为空;URL 查询串里没 id=xxx,却去查 c.QueryParam("id"),也一样。
- 确认你要取的是路径参数(如
/post/abc中的abc),不是查询参数(如/post?slug=abc) - 参数名严格区分大小写:
c.Params("ID")≠c.Params("id") - 多个参数时,别一个个调
c.Params(),改用c.ParamsValues("year", "month", "slug")一次性取,顺序对应传入名 - 可选参数如
/posts/:id/:version?,没提供:version时c.Params("version")返回空字符串"",不是nil,记得判空
最常被忽略的一点:路径参数匹配是前缀精确匹配,不是正则模糊匹配。比如定义了 /user/:id,请求 /user/123abc 会被捕获为 "123abc",但 /user/123/profile 就完全不会进这个路由——它需要额外定义 /user/:id/*rest 或拆成多段参数。










