一、使用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
	}

}

测试请求结果

 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐