Iris动态路由必须用{param:type}格式,如{id:uint64};路径参数须用ctx.Params().GetXXX()获取,不可用URLParam;宏约束(如min/max)在匹配阶段生效,失败则不进handler。

动态路由路径怎么写?{param:type} 是唯一正统写法
Iris 不支持像 Gin 那样用 :id 或 *id 的写法,所有动态参数必须用大括号包裹,格式为 {param:type}。不带类型时默认是 string,即 {id} 等价于 {id:string}。
常见类型直接写就行,比如:
-
{id:uint64}—— 只匹配纯数字,自动转成uint64,失败则 404 -
{name:alphabetical}—— 只接受英文字母(大小写均可) -
{path:path}—— 匹配多段路径,如/a/b/c全部进path参数,且必须放在最后 -
{slug:string regexp(^[a-z0-9]+(?:-[a-z0-9]+)*$)}—— 自定义正则,注意括号要完整、不能漏转义
错误写法示例:/user/:id 或 /user/{id}(没指定类型且没加引号)会导致路由注册成功但参数取不到,或静默 fallback 到 string 但类型转换失败。
怎么安全获取路径参数?别用 URLParam,用 Params().GetXxx
context.URLParam("key") 是查 query string(?key=value),不是路径参数。路径参数一律走 context.Params().GetXXX() 系列方法。
推荐按类型取值,避免手动类型转换和 panic:
-
ctx.Params().GetInt("id")→ 返回(int, error) -
ctx.Params().GetUint64Default("id", 1)→ 安全取默认值 -
ctx.Params().Get("name")→ 原始 string,适合{name:string}或无类型场景
如果用了 {id:int min(1)} 这类宏约束,GetUint64() 会直接失败(因为类型不匹配),必须用 GetInt() 或对应整型方法。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
为什么 /user/{id} 路由能匹配但参数为空?检查宏注册和路由顺序
常见现象:访问 /user/123 路由能进 handler,但 ctx.Params().Get("id") 返回空字符串。原因通常有两个:
- 路由定义中写了
{id:int64},但实际传的是"123abc"—— Iris 在匹配阶段就过滤掉,根本不会进 handler;但如果写成{id:string},它会进 handler,但值仍是"123abc",不是你想要的 clean int - 多个路由冲突,比如同时注册了
/user/{id}和/user/new,而/user/new写在后面 —— Iris 按注册顺序匹配,/user/new会被当成{id: "new"}匹配进去 - 使用了
Party但没调用ctx.Next(),导致子路由中间件中断,参数未注入
调试建议:加一行 app.Logger().Infof("params: %+v", ctx.Params().Values()) 看实际解析出什么。
想让参数更灵活?macro 函数比正则更轻量
需要校验范围(如 id > 0)、格式(如邮箱前缀)、或组合逻辑时,别硬套正则。Iris 支持在类型后链 macro 函数,比如:
-
{id:uint64 min(1) max(999999)}—— 自动拒绝超限值,404 -
{slug:string lowercase()}—— 自动转小写再存入参数 -
{token:string regexp(^\w{32}$)}—— 注意双反斜杠,Go 字符串字面量需转义
自定义 macro 更简单:app.Macros().String.RegisterFunc("hexcolor", func(s string) bool { return regexp.MustCompile(`^#[0-9a-fA-F]{6}$`).MatchString(s) }),然后就能写 {color:string hexcolor()}。
真正容易被忽略的是:macro 函数只在路由匹配阶段运行,不参与 handler 执行;一旦匹配失败,连 handler 都不会触发 —— 所以日志里看不到 “进来了但参数不对”,而是压根没日志。


















