路径参数必须用 ctx.params().get() 获取,ctx.urlparam() 仅用于查询参数;{id:uint64} 中的 key 区分大小写且需类型标注,mvc 的 byxxx 绑定依赖正确注册路由和命名严格对应。

路径参数必须用 ctx.Params().Get(),不是 ctx.URLParam()
RESTful 路由中像 /user/{id:uint64} 这种写在路径里的动态段,属于路径参数(path parameter),和 ?id=123 这种查询参数(query parameter)完全无关。ctx.URLParam("id") 永远拿不到它,只会返回空字符串——这不是 bug,是设计如此。
-
ctx.Params().Get("id")返回string,需手动转类型(如strconv.ParseUint(...)) - 若路由定义为
{userID:int64},则 key 是"userID",大小写敏感,拼错就取不到 - MVC 中使用 By 前缀绑定时(如
ByUserID int64),底层仍依赖ctx.Params(),只是自动做了类型转换
MVC 中 ByXXX 参数绑定失败的常见原因
即使写了 func (c *UserCtrl) Get(ByID uint64) string,访问 /user/123 时 ByID 仍是 0,大概率是没走对注册流程。
- 必须在控制器的
BeforeActivation回调里显式调用b.Handle("GET", "/{id:uint64}", "Get"),否则 Iris 不知道该把路径参数映射到哪个方法 - 路由键名
{id:uint64}和 By 参数名ByID必须严格对应:大小写、下划线、驼峰都不能错;{ID:uint64}对应的是ByID,不是ById - 没写类型标注(如只写
{id})→ Iris 不触发 By 绑定,参数保持零值且不报错 - 方法签名漏掉
By前缀(比如写成func Get(id uint64))→ 绑定完全不生效
ctx.Params() 和 ctx.URLParam() 别混用
两者来源不同、用途不同,混用会导致逻辑混乱或静默失败。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
ctx.Params().Get("id"):只读路径参数(/api/users/{id}) -
ctx.URLParam("id"):只读查询参数(/api/users?id=123) -
ctx.FormValue("id"):查 query + form body,有隐式优先级,来源不明确时慎用 - 一个 URL
/users/123?format=json同时含路径参数123和查询参数format,该用谁取谁,别交叉
调试时怎么快速确认参数来源?
别靠猜。加一行日志比翻文档快:
iris.Log().Infof("path param 'id': %q, query param 'id': %q",
ctx.Params().Get("id"),
ctx.URLParam("id"))
如果发现 ctx.Params().Get("id") 是空,但 URL 明明有 /user/123,说明路由注册有问题——检查 Party("/user") 是否正确、BeforeActivation 是否被调用、{id:uint64} 是否拼写一致。
路径参数解析发生在路由匹配阶段,一旦匹配失败或注册遗漏,后续所有取值操作都无意义。最容易被忽略的是大小写和类型标注的硬性匹配规则,Iris 不会警告,只会给零值。










