在前面的文章我们集成了validator字段验证器,但是大家发现没有,提示的错误信息太偏程序化,如下图:
从上图我们可以看出,对应的错误信息提示非常不友好。那有没有方法让这个提示更加的友好呢?答案是有的。具体的做法步骤如下:
1、在model中定义错误提示信息 2、编写方法,解析model中的错误提示信息。 3、在需要验证的request的model绑定的时候,如果出现错误,则使用上诉2的方法解析错误,再返回给客户端。
下面我们来演示一下。这里还是以login的时候username的验证为例。
一、定义错误提示语
首先我们在需要验证的字段上添加上自定义的错误提示语,例如前面我们在login里面的username字段中添加的验证,那么我们就砸username字段上添加错误提示语,示例如下:
type LoginReuqest struct {
Username string `json:"username" binding:"required,usernameValidator" err:"用户名不合法"`
password string `json:"password"`
}备注:这里的err可以自定义,只需要在后面编写方法的时候获取对应的key即可。
二、编写方法解析错误提示语
然后我们在validatetorconfig.go文件中编写GetValidateErr方法来解析我们定义的错误提示语,具体的方法示例如下:
func GetValidateErr(obj any, rawErr error) error {
validationErrs, ok := rawErr.(validator.ValidationErrors)
if !ok {
return rawErr
}
var errString []string
for _, validationErr := range validationErrs {
field, ok := reflect.TypeOf(obj).FieldByName(validationErr.Field())
if ok {
if e := field.Tag.Get("err"); e != "" {
errString = append(errString, fmt.Sprintf("%s: %s", validationErr.Field(), e))
continue
}
}
errString = append(errString, validationErr.Error())
}
return errors.New(strings.Join(errString, "\n"))
}三、绑定的地方解析
接下来我们在每一个requestmapping的地方,绑定对象的时候,如果出现错误就使用上面的GetValidateErr方法来解析错误。比如我们在login接口的地方使用GetValidateErr方法解析错误信息的示例如下:
loginRequest := request.LoginReuqest{}
if err := c.ShouldBindJSON(&loginRequest); err != nil {
//老的错误信息提示
//middleware.Fail(c, http.StatusBadRequest, err.Error())
//新的友好的错误信息提示
middleware.Fail(c, http.StatusBadRequest, config.GetValidateErr(loginRequest, err).Error())
return
}四、测试验证
接下来我们启动项目测试验证一下:
可以看到现在的显示是我们自定义的错误信息了,是不是变得友好了?
最后按照惯例,附上本案例的源码,登陆后即可下载。



还没有评论,来说两句吧...