Gin 框架自定义验证错误提示信息

3,286 阅读1分钟

前言

使用 Gin 框架通过自定义的结构体绑定表单请求数据,参数校验未通过时,返回的错误信息可读性差,如下所示:

// 表单结构体
type LoginForm struct {
	User     string `form:"user" binding:"required"`
	Password string `form:"password" binding:"required"`
}

func Login(c *gin.Context) {
    var form LoginForm
    if err := c.ShouldBindJSON(&form); err != nil {
      c.JSON(400, gin.H{"message": err.Error()})
      return
    }
}
// 返回数据
{
    "message": "Key: 'LoginForm.User' Error:Field validation for 'User' failed on the 'required' tag\nKey: 'LoginForm.Password' Error:Field validation for 'Password' failed on the 'required' tag"
}

改造

  1. 定义验证器接口 Validator

    package request
    
    import "github.com/go-playground/validator/v10"
    
    // 验证器接口
    type Validator interface {
        // 获取验证器自定义错误信息
        GetMessage() ValidatorMessages
    }
    
    // 验证器自定义错误信息字典
    type ValidatorMessages map[string]string
    
    // 获取自定义错误信息
    func GetErrorMsg(request Validator, err error) string {
        for _, v := range err.(validator.ValidationErrors) {
           if message, exist := request.GetMessages()[v.Field() + "." + v.Tag()]; exist {
               return message
           }
           return v.Error()
        }
        return "Parameter error"
    }
    
  2. 表单结构体 LoginForm 实现验证器接口 Validator

    package request
    
    type LoginForm struct {
        User     string `form:"user" binding:"required"`
        Password string `form:"password" binding:"required"`
    }
    
    func (loginForm LoginForm) GetMessages() ValidatorMessages {
        return ValidatorMessages{
            "User.required": "请输入用户名",
            "Password.required": "请输入密码",
        }
    }
    

使用

func Login(c *gin.Context) {
    var form request.LoginForm
    if err := c.ShouldBindJSON(&form); err != nil {
        c.JSON(400, gin.H{"message": request.GetErrorMsg(form, err)})
        return
    }
}
// 返回数据
{
    "message": "请输入用户名"
}