Golang全靠你了

gin 扩展请求参数验证

2020-09-17  本文已影响0人  Godan

既然 gin 都已经集成了 go-playground/validator/v10 ,我们为啥不扩展一下下它呢?

比如,验证字符串长度必须在6~8这个区间中

type Request struct {
  Name string `json:"name" binding:"required,minLen=6,maxLen=8"`
}

按照 go-playground/validator/v10 提供的例子,我大概要写这样的验证函数

// 不许字符串长度大于设定值
func maxLen(fl validator.FieldLevel) bool {
    vlen := len(fl.Field().String())
    param := fl.Param()
    if param == "" {
        panic("maxLen format: maxLen=1")
    }
    v, err := strconv.Atoi(param)
    if err != nil {
        panic("maxLen:" + err.Error())
    }

    return vlen <= v
}
// 不许字符串长度小于设定值
func minLen(fl validator.FieldLevel) bool {
    // ... 与maxLen太像,这里省略它
    return vlen >= v
}

好了,现在谁来告诉我要怎么把它们接入到 gin

(5分钟过去后,我还是没等到那个人,所以就去看代码了)

代码说 binding.Validator.Engine() 里面装着 *validator.Validatego-playground/validator/v10 说那咱们接着抄例子吧

// 调用它,完成扩展注册
func InitExtendValidation() {
    v, ok := binding.Validator.Engine().(*validator.Validate)
    if !ok {
        log.Fatal().Msg("validator engine changed")
        return
    }

    // 注册新的自定义验证规则
    var err error
    for _, e := range []struct {
        tag string
        fn  func(fl validator.FieldLevel) bool
    }{
        {"minLen", minLen},
        {"maxLen", maxLen},
    } {
        err = v.RegisterValidation(e.tag, e.fn)
        if err != nil {
            log.Fatal().Err(err).Str("tag", e.tag).Msg("validator")
        }
    }
}

哎,这就完了。

上一篇下一篇

猜你喜欢

热点阅读