必须用ctx.params().get()提取路径参数,ctx.urlparam()仅读取查询字符串;带类型路由如{oid:uint64}需用getuint64()等对应方法,大小写敏感且未标注类型不触发by绑定。

必须用 ctx.Params().Get(),不是 ctx.URLParam()。后者只读 query string(如 /user?id=123),而路径参数(如 /user/{id:uint64})完全走另一套机制,混用会导致取到空字符串却查半天数据库或 token 逻辑。
怎么正确提取带类型的路径参数
注册路由时声明类型,handler 中调用对应类型方法,Iris 会在匹配阶段做基础校验,并在取值时自动转换:
-
app.Get("/order/{oid:uint64}", handler)→ 用ctx.Params().GetUint64("oid"),失败返回 0 和 error -
app.Get("/user/{active:bool}", handler)→ 用ctx.Params().GetBool("active"),只认"1"/"true"/"0"/"false"等几种写法 -
app.Get("/file/{name:file}", handler)→ 仍用ctx.Params().Get("name"),但框架已校验内容是否符合文件名规则(字母、数字、_、-、.)
注意:参数名大小写敏感,{OrderID:uint64} 就得用 GetUint64("OrderID"),写成 "orderid" 或 "orderid" 都返回空,且不 panic —— 容易漏掉非空判断。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
如何捕获整段子路径(比如 /a/b/c.txt)
用 {path:path} 类型,它必须放在路径末尾,且前面不能紧挨斜杠:
- ✅ 合法:
/files/{name:path},请求/files/a/b/c.txt→ctx.Params().Get("name")返回"a/b/c.txt" - ❌ 非法:
/files/{name:path}/meta,Iris 启动会 panic - ⚠️ URL 编码未自动解码:
/files/hello%20world.txt→ 取出的是"hello%20world.txt",需手动调用url.PathUnescape()
控制器里用 By 前缀绑定参数要满足什么条件
仅当路由参数显式标注类型时,Iris 才启用 By 绑定机制:
- 路由定义必须含类型,例如
userAPI.Get("/profile/{uid:int64}/{role:string}", "Profile") - 控制器方法签名中参数名必须是
By+ 路由键名首字母大写,即ByUid int64和ByRole string - 若写成
{user_id:int64},则参数名必须是ByUserId int64,不能省略下划线转驼峰 - 没标注类型(如
{uid})的参数,By 绑定不生效,仍需手动ctx.Params().Get()
路径参数解析看似简单,但类型声明位置、命名大小写、编码处理、By 绑定触发条件这四点,任一疏忽都会让参数“凭空消失”,而且不报错 —— 最容易被忽略的是 :path 类型的 URL 解码和 ByXxx 的驼峰规则。










