在前面的文章我们集成了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 }
四、测试验证
接下来我们启动项目测试验证一下:
可以看到现在的显示是我们自定义的错误信息了,是不是变得友好了?
最后按照惯例,附上本案例的源码,登陆后即可下载。
还没有评论,来说两句吧...