必须在iris.New()后、注册路由前设置app.Validator = validator.New(),否则ReadJSON等不触发校验;字段需用validate:"required"而非binding标签;校验失败需手动判断validator.ValidationErrors并统一返回400响应。

怎么让Validator自动跑在ReadJSON等绑定操作里
必须在iris.New()之后、注册任何路由之前,给app.Validator赋值一个validator.Validate实例,否则ReadJSON、ReadForm等方法不会触发校验逻辑。
常见错误现象:结构体字段打了validate:"required"标签,但空请求照样通过,没返回400错误——根本原因是app.Validator还是nil。
- 用
github.com/go-playground/validator/v10时,直接app.Validator = validator.New() - 别在
BeforeActivation钩子里设app.Validator,它只影响路由激活,不控制绑定器初始化时机 - 若用了自定义验证函数(比如
registerValidation),也得在这一步之后、路由注册之前完成
结构体字段怎么写binding标签才生效
Iris的校验器不认binding标签,只读validate——这是新手最常踩的坑。哪怕你抄了其他框架的写法,比如binding:"required",Iris也会完全忽略。
使用场景:接收JSON登录请求,要求username非空、password至少6位。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 正确写法:
Username string `json:"username" validate:"required"` - 密码长度校验:
Password string `json:"password" validate:"required,min=6"` - 嵌套结构体也支持,只要内层字段也有
validate标签 - 注意大小写:标签名必须是
validate,不是valid、validation或binding
校验失败后怎么统一返回错误格式
Iris不会自动拦截校验错误并返回HTTP响应,你需要手动检查ReadXXX的error是否来自validator,再决定怎么处理。
典型错误现象:校验失败时返回空响应或500,而不是400 + 友好提示。
- 调用
ctx.ReadJSON(&req)后,用errors.As(err, &validationErrors)判断是否为validator错误(需导入github.com/go-playground/validator/v10) - 推荐封装一个
bindAndValidate辅助函数,内部统一处理err != nil分支 - 不要依赖
ctx.StatusCode(400)后直接ctx.JSON就完事——某些validator错误可能带多个字段问题,建议提取err.(validator.ValidationErrors)转成map返回
为什么Party子路由里校验不生效
校验器本身是全局的,和路由分组无关;但如果你在Party里注册的handler没调用ReadJSON等绑定方法,或者用了ReadBody又没配app.Validator,就会看起来“不生效”。
容易被忽略的地方:路径参数(如{id:uint64})和查询参数(?page=1)的校验不走validate标签,得手动用ctx.Params().GetUint64或ctx.URLParam加条件判断。
-
ReadQuery支持validate标签,但前提是结构体字段对应查询参数名,且调用前已设app.Validator -
ReadForm同理,适用于application/x-www-form-urlencoded - 路径参数校验只能靠类型断言(如
GetUint64失败会返回error)或额外加if id == 0类逻辑


















