gin框架中的required_if 验证条件为什么不起作用 ?
1. 运行环境
go version go1.20.2 windows/amd64
2. 问题描述?
required_if 验证规则不生效
后端代码如下
package main
import (
"github.com/gin-gonic/gin"
)
type UserDemo struct {
Name string `json:"name" binding:"required,max=255"`
Email string `json:"email" binding:"required,email"`
AuthRule []*AuthRules `json:"auth_rule" binding:"required,gt=0,dive"`
}
type AuthRules struct {
AuthType *int `json:"auth_type" binding:"required,gte=0"`
StartTime *string `json:"start_time" binding:"required,datetime=15:04:05"`
EndTime *string `json:"end_time" binding:"required,datetime=15:04:05,gtcsfield=StartTime"`
IsEnableSpecial *int `json:"is_enable_special" binding:"required,oneof=1 2"`
SpecialRange []*SpecialRange `json:"special_range" binding:"required_if=IsEnableSpecial 1,omitempty,dive"`
}
type SpecialRange struct {
StartTime string `json:"start_time" binding:"required,datetime=15:04:05"`
EndTime string `json:"end_time" binding:"required,datetime=15:04:05,gtcsfield=StartTime"`
}
func main() {
r := gin.Default()
r.POST(
"/demo", func(c *gin.Context) {
var user UserDemo
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(
200, gin.H{
"code": 422,
"msg": "参数验证错误",
"err": err.Error(),
},
)
return
}
c.JSON(
200, gin.H{
"code": 200,
"msg": "success",
"user": user,
},
)
},
)
r.Run(":8000")
}
前端提交的json格式数据
{
"name": "demo",
"email": "abc123@126.com",
"auth_rule": [
{
"auth_type":10,
"start_time": "08:00:00",
"end_time": "21:00:00",
"is_enable_special": 2,
"special_range": [
{
"start_time": "09:00:00",
"end_time": "08:00:00"
}
]
}
]
}
3. 您期望得到的结果?
当传递的参数is_enable_special 等于 1 才进行对 special_range 参数进行验证
4. 您实际得到的结果?
现在的情况是 不管 is_enable_special 等于多少, 都会对 special_range 参数进行验证
我的理解是required_if这个是判断指定字段是在满足条件的情况下必传,但是它不会影响后面的验证条件
如果你是想多级别验证写法如下
如果是正常的校验,只需要简单的写一次就行了
required_if=Field
试试 excluded_if 或者 excluded_unless 行不行
把 omitempty 代替为 omitnil