一、使用validator根据需求需要稍做调整
1.需要说明的是,gin框架有自己的验证包,我们也可以用第三方的验证包,不过都差不多,在我们进行项目开发中,有如下几个问题:
1)、同时返回多个字段的错误,可通过遍历错误信息,只返回一条
2)、返回的错误信息为英文的,要转译成中文
3)、对应错误信息的字段名称为英文,需要转为中文
二、需要下载的包
"github.com/go-playground/locales/zh_Hans_CN"
unTrans "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zhTrans "github.com/go-playground/validator/v10/translations/zh"
如上的包,通过 go get 获取
三、封装验证方法
package validator
import (
"fmt"
"github.com/go-playground/locales/zh_Hans_CN"
unTrans "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zhTrans "github.com/go-playground/validator/v10/translations/zh"
"reflect"
)
func Validate(data interface{}) (string,int) {
//验证对象 并将英文报错转换成中文报错(message)
validate := validator.New()
uni := unTrans.New(zh_Hans_CN.New())
trans,_ := uni.GetTranslator("zh_Hans_CN")
err := zhTrans.RegisterDefaultTranslations(validate,trans)
if err != nil {
fmt.Println("err:",err)
}
//将验证法字段名 映射为中文名
validate.RegisterTagNameFunc(func(field reflect.StructField) string {
label := field.Tag.Get("label")
return label
})
err = validate.Struct(data)
if err != nil {
//错误可能有多个 遍历 返回一个
for _,v := range err.(validator.ValidationErrors) {
return v.Translate(trans),500
}
}
return "",200
}
四、使用验证
json : json转换字段名
validate:验证规则
label:字段名对应的 中文名
// 表单数据 需要tag参数
type User struct {
UserName string `json:"username" validate:"required,min=4,max=12" label:"用户名"`
PassWord string `json:"password" validate:"required,min=6,max=20" label:"密码"`
}
控制器中使用validator
func AddUser(c *gin.Context) {
var data models.User
//接收请求参数
_ = c.ShouldBindJSON(&data)
//验证数据并返回结果
msg,code := validator.Validate(&data)
//验证报错,返回错误信息给前端
if code != 200 {
c.JSON(http.StatusOK,gin.H{
"status":code,
"message":msg,
})
return
}
}
测试请求结果