前言
使用 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"
}
改造
-
定义验证器接口
Validatorpackage 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" } -
表单结构体
LoginForm实现验证器接口Validatorpackage 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": "请输入用户名"
}