路由参数类型必须显式声明,否则默认为string;{id}与{id:string}效果相同但无法用GetInt等强类型方法安全取值;Iris不自动推断语义,需类型标注触发校验;{path:path}必须位于路径末尾且后不可接斜杠;自定义宏如min(1)可在匹配阶段拦截非法值。

路由参数类型必须显式声明,否则默认为 string
不写类型时,{id} 和 {id:string} 效果一样,但后续无法用 GetInt 等强类型方法安全取值。Iris 不会自动推断数字或布尔语义,必须靠类型标注触发校验和转换逻辑。
常见错误现象:调用 ctx.Params().GetInt("id") 返回 0 且 err != nil,但没意识到是路由里漏写了 :int —— 此时参数虽存在,但只是字符串,强转必然失败。
-
{id:int}→ 对应 Go 的int,匹配失败返回 404(非 panic) -
{uid:uint64}→ 推荐用于主键 ID,避免负数;配合GetUint64可省略err检查 -
{active:bool}→ 只接受"1"/"true"/"0"/"false"等标准值,大小写不敏感 -
{name:alphanumeric}→ 仅允许字母、数字、下划线、短横线,适合用户名或 slug
path 类型必须放在路径末尾,且不能跟斜杠
{path:path} 是唯一能捕获多段子路径的类型,但它有硬性位置限制:必须是最后一个路径段,且后面不能再接 / 或其他参数。例如 /files/{name:path} 合法,而 /files/{name:path}/meta 会直接报错或匹配失败。
使用时注意:ctx.Params().Get("name") 返回的是原始 URL 编码字符串(如 a%20b/c.txt),Iris 不做自动解码。若需处理空格或中文,得手动调用 url.PathUnescape。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 请求
/static/js/app.min.js?v=1→Get("path")返回"js/app.min.js?v=1"(问号后内容也被包含) - 请求
/user/123/profile/edit配/user/{id:uint64}/{path:path}→ 不合法,因为{path:path}前面紧邻/,且中间还有其他参数
自定义宏能提前拦截非法值,比运行时判断更可靠
用内置类型(如 :int)只能保证格式合法,但业务上常需数值范围控制。此时注册自定义宏,在路由匹配阶段就过滤掉无效请求,handler 根本不会执行。
例如注册 min(1) 宏后,/order/{oid:int min(1)} 对 /order/0 直接 404,而不是进 handler 再做 if oid 判断。
- 注册方式:
app.Macros().Int.RegisterFunc("min", func(min int) func(string) bool { ... }) - 路由中写法:
/product/{pid:int min(1) max(999999)} - 多个条件可叠加,顺序无关;任意一个不满足即不匹配
- 宏函数返回
false时,Iris 视为该路由不匹配,不调用 handler
By 参数绑定只在 MVC 控制器中生效,且命名严格匹配
如果用 mvc.New(app.Party("/api")).Handle(&MyController{}),控制器方法才能用 ByID uint64 这种签名接收参数。直接 app.Get() 定义的 handler 不支持 By 绑定。
参数名不是简单小写转大写:{user_id:int} 对应 ByUserId int,不是 ByUser_id 或 ByUserid。拼错或大小写偏差会导致值为零值,且无任何警告。
- 路由
/post/{slug:string}→ 方法参数必须是BySlug string - 路由
/v1/{version:long}→ 方法参数是ByVersion int64(:long即int64) - 未注册到 MVC 的结构体,即使写了
ByXxx,也只会收到零值


















