“github.com/go-playground/validator/v10”
参考文章:Gin 使用 validator 实现参数校验
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"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"
zhtranslations "github.com/go-playground/validator/v10/translations/zh"
"reflect"
"strings"
)
type User struct {
// form字段要和json字段一致
Name string `form:"user_name" json:"user_name" binding:"user_name"`
}
func main() {
v, ok := binding.Validator.Engine().(*validator.Validate)
if !ok {
panic("断言失败...")
}
// 1.自己注册获取jsonTag的值函数
// GetTag函数
v.RegisterTagNameFunc(GetTag)
zhT := zh.New() //中文翻译器
enT := en.New() //英文翻译器
//第一个参数是备用的语言环境,后面的参数是应该支持的语言环境
uni := ut.New(enT, zhT, enT)
// 根据输入获取传入指定的翻译器
trans, ok := uni.GetTranslator("zh")
_ = zhtranslations.RegisterDefaultTranslations(v, trans)
// 2.自己注册 自定义获取json标签值的中文翻译 // tranUserNameRegis函数 tranUserName函数
_ = v.RegisterTranslation("user_name", trans, tranUserNameRegis, tranUserName)
// 3.自定义标签user_name的验证器 // validateUsername函数
err := v.RegisterValidation("user_name", validateUsername)
if err != nil {
fmt.Println("验证器注册失败")
panic(err)
}
e := gin.Default()
e.POST("/testUser", func(c *gin.Context) {
if err := c.ShouldBind(&User{}); err != nil {
errs, ok := err.(validator.ValidationErrors)
if !ok {
panic(errs.Error())
}
translate := ""
for _, err := range errs {
translate = err.Translate(trans)
fmt.Println(translate)
}
c.JSON(200, gin.H{"myCode": translate})
return
}
c.JSON(200, gin.H{"myCode": "OK"})
return
})
_ = e.Run(":8080")
}
func GetTag(fld reflect.StructField) string {
name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
if name == "-" {
return ""
}
return name
}
// 注册user_name标签的翻译
func tranUserNameRegis(ut ut.Translator) error {
// {0} 就是user_name标签名
return ut.Add("user_name", "{0}非法的用户名!", true)
}
// user_name翻译函数
func tranUserName(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("user_name", fe.Field())
return t
}
// 自定义user_name验证器
func validateUsername(fl validator.FieldLevel) bool {
if fl.Field().String() == "111" {
return true
}
return false
}