Iris路由参数类型校验必须在路径中声明,非法值在匹配阶段即被拦截并返回404,无法进入handler;支持内置类型(如{id:int}、{enabled:boolean})、自定义宏(如min100)及安全文件路径校验(:file、:path)。

路由参数类型校验必须写在路径里,不是 handler 里
很多人以为要在 controller 方法里手动调用 strconv.Atoi 或检查范围,其实 Iris 的参数校验是路由匹配阶段的事——只要路径中声明了类型,非法值根本进不了 handler。
-
/user/{id:int}:请求/user/abc直接 404,不会触发任何 controller 方法 -
/flag/{enabled:boolean}:只接受true、1、FALSE等 12 种明确字符串,yes或空值也 404 - 参数名只能是字母,
{user_id:int}会报错;必须写成{userid:int} - 省略类型如
/name/{username}等价于/name/{username:string},不做校验
自定义数值范围校验要注册宏函数,不能硬编码在 handler
内置类型不够用时(比如要求 ID ≥ 100),得提前注册宏函数,而不是在 controller 里 if-else 判断。否则校验逻辑分散、易漏、无法复用。
- 注册示例:
app.Macros().Int.RegisterFunc("min100", func(min int) func(string) bool { return func(v string) bool { n, _ := strconv.Atoi(v); return n >= min } }) - 使用方式:
app.Get("/order/{id:int min100}", handler)——/order/99直接不匹配 - 注意:必须导入
strconv,否则编译失败;函数名里不能带括号,min(100)是错的,应写min100或先注册min再用min(100)
表单字段校验别自己 parse,用 Iris 封装好的 PostValueXXX 方法
POST 表单或 query 参数的类型转换,Iris 提供了一套带容错的读取方法,比手写 strconv 安全得多,且返回值明确可判断。
-
ctx.PostValueInt("age")→ 返回(int, error),输入"123abc"时error != nil,不会 panic -
ctx.PostValueIntDefault("age", 18)→ 出错或为空时直接返回 18,适合有合理默认值的场景 -
ctx.PostValueTrim("username")→ 自动去首尾空格,避免" admin "导致校验失败 - 如果没配
WithPostMaxMemory又传了文件,所有PostValue*都返回空,且无任何错误提示——这是最难排查的坑之一
MVC controller 里不能靠返回 error 触发校验,必须显式中断
Iris 的 MVC 层完全不拦截 controller 方法返回的 error,哪怕你写 func() error,框架也当它不存在。想让校验生效,必须主动控制流程。
- 推荐做法:用
ctx.StopWithStatus(400)+ctx.JSON()组合,且StopWithStatus后必须return,否则后续代码照常执行 - 不推荐 panic:虽然能被 recover 捕获,但会掩盖真实 panic 类型,调试困难;且和中间件的
StopExecution()语义冲突 - 特别注意:
ctx.StopWithStatus不等于ctx.StatusCode,前者会中断执行流,后者只是设状态码
Iris 的自动化参数校验真正起效的前提,是把校验逻辑推到最外层——路由声明、宏注册、封装读取方法,而不是塞进 controller 方法体里。一旦混用手工解析和框架自动校验,就容易出现“看似校验了,实则漏掉”的情况。










