gin 自定义参数验证方法及使用ShouldBindJSON方法进行参数验证时自定义输出的错误信息

使用gin框架开发时,需要对客户端传入的参数进行验证,但是框架自带的错误输出并不是很友好,所以需要我们自己封装,将错误信息转为对前端友好的信息输出

一、定义验证文件

我是新建一个跟main.go文件同级的common文件夹,在文件夹中创建validator.go文件

#需要导入插件
go get github.com/go-playground/universal-translator
go get github.com/go-playground/locales
package common

import (
	"github.com/gin-gonic/gin/binding"
	"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"
	"strings"
)

var (
	uni      *ut.UniversalTranslator
	validate *validator.Validate
	trans    ut.Translator
)

//定义字段名称,此处对应的是你的结构体中binding的字段名称
var fieldName = map[string]string{
	"Username": "用户名",
	"Password": "用户密码",
	"Avatar":   "用户头像",
}

//定义自定义方法,此处对应的是你的自定义验证方法的标签名称,因为有可能插件自带的验证方法并不能完全满足我们的需要,就需要自己定义
var myTags = map[string]string{
	"myvalidate": "必须通过自定义方法验证",
}

//这是一个自定义验证方法
var myvalidate validator.Func = func(fl validator.FieldLevel) bool {
	val, ok := fl.Field().Interface().(string)
	if ok {
		if val != "gangan" {
			return false
		}
	}

	return true
}

func init() {
	translator := zh.New()
	uni = ut.New(translator, translator)
	trans, _ = uni.GetTranslator("zh")

	var (
		validate *validator.Validate
		ok       bool
	)

	//注册自定义验证方法
	if validate, ok = binding.Validator.Engine().(*validator.Validate); ok {
		validate.RegisterValidation("myvalidate", myvalidate)
	}

	_ = zhTranslations.RegisterDefaultTranslations(validate, trans)
}

func Translate(err error) string {
	var result string

	errors := err.(validator.ValidationErrors)

	for _, err := range errors {

		//判断是自定义验证方法
		var (
			tag   = err.Tag()   //绑定的验证方法
			field = err.Field() //绑定的验证字段
			msg   string
		)
		if val, exist := myTags[tag]; exist {
			msg = field + val + ";"
		} else {
			msg = err.Translate(trans) + ";"
		}

		if val, exist := fieldName[field]; exist {
			msg = strings.Replace(msg, field, val, 1)
		}

		result += msg
	}
	return result
}

二、使用

1、定义参数结构体

type (
	//注册请求结构体,此处使用的自定义验证方法myvalidate
	RegisterRequest struct {
		Username string `json:"username" binding:"required,min=3,max=25,myvalidate"`
		Password string `json:"password" binding:"required,min=6,max=25"`
		Avatar   string `json:"avatar" binding:"required,url"`
	}
)

2、调用

	var (
		err error
		res *RegisterRequest
	)

	res = new(RegisterRequest)

	//进行参数验证
	if err = c.ShouldBindJSON(res); err != nil {
		//验证未通过,使用自定义的错误输出方法,获取错误信息
		core.ResponseError(c, common.Translate(err))
		return
	}

结果

gin 自定义参数验证方法及使用ShouldBindJSON方法进行参数验证时自定义输出的错误信息_第1张图片

你可能感兴趣的:(gin,golang)