Echo – 定制Vlidate 参数校验

624 次浏览次阅读
没有评论

参数自动绑定和校验是 Web 框架很重要的两个功能,可以极大的提升开发速度,并更好的保证数据的可靠性(服务端数据校验很重要)。话不啰嗦,直接上 demo

用到的第三方包: gp-palyground/validator

github.com/go-playground/validator/v10

Demo

package main

func main() {e := echo.New()

    e.POST("/test/validator", func(c echo.Context) error {
        type User struct {
            Name  string `json:"name" validate:"required"`
            Age   uint   `json:"age" validate:"required,gte=1,lte=100"`
            Email string `json:"email" validate:"required,email"`
        }
        user := &User{}
        err := c.Bind(user)

    validate := validator.New()

    e := en.New()
    uniTrans := ut.New(e, e, zh.New())
    translator, _ := uniTrans.GetTranslator("zh")
    err := zh2.RegisterDefaultTranslations(validate, translator)
    if err != nil {log.Fatal(fmt.Sprintf("i18n 转换失败 "), zap.Error(err))
    }

        err = validate.Struct(user)
        if err != nil {errs := err.(validator.ValidationErrors)
            var msg string
            for _, err := range errs {msg = err.Translate(translator)
            }
            return c.JSON(http.StatusOK, msg)
        }
        return c.JSON(http.StatusOK, user)
    })

  e.Logger.Fatal(e.Start(":9000")
}

拆分
validate/validate.go

package validate

import (
    "log"

    "github.com/go-playground/locales/en"
    "github.com/go-playground/locales/zh"
    ut "github.com/go-playground/universal-translator"
    "github.com/go-playground/validator/v10"
    zh2 "github.com/go-playground/validator/v10/translations/zh"
)

type BindValidate struct{}

var Bv *BindValidate

// BindValidate
// i18n
func (bv *BindValidate) BindValidate() (ut.Translator, *validator.Validate) {validate := validator.New()
    e := en.New()
    unitrans := ut.New(e, e, zh.New())
    translator, _ := unitrans.GetTranslator("zh")
    err := zh2.RegisterDefaultTranslations(validate, translator)
    if err != nil {log.Printf("i18n 国际化失败: %v", err)
    }
    return translator, validate
}

utils/validate.go

package utils

import (
    validate2 "github.com/demo/common/validate"

    "github.com/go-playground/validator/v10"
)

var msg string

// ValidateParam
func ValidateParam(params interface{}) string {translator, validate := validate2.Bv.BindValidate()
    err := validate.Struct(params)
    if err != nil {errs := err.(validator.ValidationErrors)
        for _, err := range errs {msg = err.Translate(translator)
        }
        return msg
    }
    return ""
}

使用
handler/auth.go

type AuthLoginParams struct {
    LoginAccount string `json:"login_account" validate:"required"`
    Password     string `json:"password" validate:"required,gte=6,lte=12"`
}

func AuthLogin(c echo.Context) error {param := &AuthLoginParams{}
    _ = c.Bind(param)
    msg := utils.ValidateParam(param)
    if msg != "" {return utils.ToJson(c, utils.Res.FailResponseJson(cast.ToString(msg), ""))
    }
}
正文完
 0
评论(没有评论)