Iris 路由支持在参数后直接加 {id:int min(1) max(999999)} 实现匹配阶段数值校验,非法请求直接 404;需与基础类型联用、括号无空格、多约束顺序执行;带宏约束时 GetInt64() 的 err 恒为 nil,无需检查。

怎么在路由里写 min/max 数值范围约束
直接在参数名后加 {id:int min(1) max(999999)} 这类语法,Iris 会在请求匹配阶段就做校验,不满足条件的路径(比如 /order/0 或 /order/1000000)根本不会进 handler,直接 404。
注意三点:
-
min和max必须和基础类型一起用,比如int、uint64,单独写{id:min(1)}不生效 - 括号里不能有空格:
min(1)✅,min( 1 )❌ - 多个约束按顺序写,Iris 会依次检查,任意一个失败即跳过该路由
为什么 GetInt64() 还要检查 err?除非用了宏
如果你的路由是 app.Get("/user/{id}")(没带类型和约束),那 ctx.Params().GetInt64("id") 可能 panic 或返回错误;但如果是 app.Get("/user/{id:int min(1)}"),Iris 已在匹配时筛掉非法值,此时 GetInt64("id") 必然成功,err 永远为 nil,可省略判断。
常见误操作:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 写了宏约束却还在 handler 里重复做
if id 校验——多余,且掩盖了路由层本应拦截的问题 - 用了
{id:uint64}却传负数,结果 404,但没意识到是宏在起作用,以为是路由没注册上 - 把
min(0)当成“允许 0”,其实uint64类型本身就不支持负数,min是额外叠加的下限
自定义宏函数怎么注册并用于范围校验
如果内置的 int min/max 不够用(比如要限制 ID 是 1000~9999 的偶数),就得自己注册宏函数。调用 iris.RegisterMacro,传入函数名和校验逻辑:
iris.RegisterMacro("even", func(param string) bool {
i, _ := strconv.ParseInt(param, 10, 64)
return i%2 == 0 && i >= 1000 && i <= 9999
})
之后就能在路由里用 {id:even}。关键点:
- 函数必须返回
bool,true表示通过,false直接不匹配 - 函数体内不要 panic,Iris 捕获异常后也当
false处理 - 宏名区分大小写,
{id:Even}和{id:even}是两个不同宏
path 类型不能和 min/max 混用,这是硬限制
{path:path} 是专门用来捕获完整子路径的(如 /files/a/b/c.txt → "a/b/c.txt"),它底层不走数值解析,所以你写 {path:path min(1)} 会被 Iris 忽略,min 不生效。
如果真需要对 path 段做长度或格式校验,只能:
- 在 handler 里手动用
len(ctx.Params().Get("path"))判断 - 或用正则宏:
{path:regex(^[-a-zA-Z0-9/._]+\$)},但注意regex宏需提前注册(Iris 默认不带) - 别指望路由层自动解码 URL 编码——
%20会原样传入,得自己调url.PathUnescape
ctx.Params().Get() 的返回类型。你仍得按声明的类型去取值,否则类型转换失败的错误不会被宏兜底。


















