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 参数进行验证

gin框架中的required_if  验证条件为什么不起作用 ?

5. 我参考搜索过了一些资料

github.com/go-playground/validator...

kinyou
讨论数量: 8

我的理解是required_if这个是判断指定字段是在满足条件的情况下必传,但是它不会影响后面的验证条件

10个月前 评论
kinyou (楼主) 10个月前

如果你是想多级别验证写法如下

Source          uint64 `json:"source" binding:"required,oneof=1 2 3 4"`
Type            uint8  `json:"type"   binding:"required,oneof=1 2"`    
Password        string `json:"password" binding:"required_if=Source 1,required_if=Source 2,required_if=Source 3"`

// 我的需求是 Source 是 4 的情况下可以不输入密码,所以我写了多个  required_if=Source N

如果是正常的校验,只需要简单的写一次就行了 required_if=Field

10个月前 评论
kinyou (楼主) 10个月前
Aliliin (作者) 10个月前
kinyou (楼主) 10个月前

试试 excluded_if 或者 excluded_unless 行不行

10个月前 评论
kinyou (楼主) 10个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!