【问题标题】:Golang Validator with custom structs带有自定义结构的 Golang 验证器
【发布时间】:2020-06-22 20:13:15
【问题描述】:

我正在尝试使用 Golang 验证器 (https://godoc.org/gopkg.in/go-playground/validator.v9) 来验证请求正文。我有两个实体,规则和项目。 Item 实体依赖于 Rule 实体。

type Rule struct {
    RuleNo      int64     `json:"ruleNo" db:"rule_no"`
    Category    string    `json:"category" db:"category" validate:"alphanum"`
    CreatedAt   time.Time `json:"createdAt" db:"created_at"`
    UpdatedAt   time.Time `json:"updatedAt" db:"updated_at"`
}

type Item struct {
    SeqNo       int64     `json:"-" db:"item_restriction_no"`
    ItemId      string    `json:"itemId" db:"item_id" validate:"alphanum"`
    ItemType    string    `json:"itemType" db:"item_type" validate:"alphanum"`
    Rules       []Rule    `json:"rules" db:"rules"` // how to validate this field?
    CreatedAt   time.Time `json:"createdAt" db:"created_at"`
    UpdatedAt   time.Time `json:"updatedAt" db:"updated_at"`
}

如何验证请求正文是否具有 Item 结构的“规则”字段的规则列表?这是我的验证功能:

func (item *Item) Validate() error {
    v := validator.New()
    if err := v.Struct(item); err != nil {
        return err
    }
    return nil
}

【问题讨论】:

    标签: validation go request


    【解决方案1】:

    从示例here,您可以执行以下操作:

    type Rule struct {
        ...
    }
    type Item struct {
        ...
        Rules []Rule `json:"rules" db:"rules" validate:"required"`
        ...
    }
    

    【讨论】:

    • 这不只是检查以确保请求正文需要规则字段吗?我如何才能真正检查以确保请求正文中的“规则”字段与我的结构匹配?
    • 这不是必需的,因为 Go 确保 Item.Rules 始终是 Rule 的数组。请看这个例子:play.golang.org/p/Rb_oAy7gcdm
    【解决方案2】:

    您可以使用dive 告诉验证器进入切片:

    Rules       []Rule    `json:"rules" db:"rules" validate:"dive"`
    

    【讨论】:

      【解决方案3】:

      有两种方法可以做到这一点

      1. 大于 :对于数字,这将确保该值大于给定的参数。对于字符串,它检查字符串长度是否大于该字符数。对于切片、数组和映射,它会验证项目的数量。

      例子:

      Rules       []Rule    `json:"rules" db:"rules" validate:"gt=2"` 
      
      1. Minimum :对于数字,min 将确保该值大于或等于给定的参数。对于字符串,它会检查字符串长度是否至少为该字符数。对于切片、数组和映射,验证项目数。

      例子:

      Rules       []Rule    `json:"rules" db:"rules" validate:"min=3"`
      

      【讨论】:

      • 是的,我知道我可以检查数组的长度,但是有没有办法验证每个对象都是 Rule 对象?如果用户在列表中输入整数而不是 Rule 对象会怎样?那么这将不起作用
      • Golang 是静态类型语言。您不能将整数放入 []Rule
      猜你喜欢
      • 2016-05-13
      • 1970-01-01
      • 2011-03-26
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多