在使用 gin 框架的过程中, 请求验证的错误信息返回一直困扰着我, gin 的文档中是这样来返回错误信息的
router.POST("/loginJSON", func(c *gin.Context) {
var json Login
if err := c.ShouldBindJSON(&json); err == nil {
if json.User == "manu" && json.Password == "123" {
c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
} else {
c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
}
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
而我们得到的错误提示大概就是这样的
{
"message": "Key: 'LoginRequest.Mobile' Error:Field validation for 'Mobile' failed on the 'required' tag\nKey: 'LoginRequest.Code' Error:Field validation for 'Code' failed on the 'required' tag"
}
这样的提示信息不是很友好, 在 validator 文档中也说明了这个信息只是用在开发时进行调试用的. 那么我们怎么返回自定义的验证提示呢. 参考 validator 文档, 我是这样来实现的.
首先定义绑定模型
import (
"gopkg.in/go-playground/validator.v8"
)
// 绑定模型
type LoginRequest struct {
Mobile string `form:"mobile" json:"mobile" binding:"required"`
Code string `form:"code" json:"code" binding:"required"`
}
// 绑定模型获取验证错误的方法
func (r *LoginRequest) GetError (err validator.ValidationErrors) string {
// 这里的 "LoginRequest.Mobile" 索引对应的是模型的名称和字段
if val, exist := err["LoginRequest.Mobile"]; exist {
if val.Field == "Mobile" {
switch val.Tag{
case "required":
return "请输入手机号码"
}
}
}
if val, exist := err["LoginRequest.Code"]; exist {
if val.Field == "Code" {
switch val.Tag{
case "required":
return "请输入验证码"
}
}
}
return "参数错误"
}
如何使用模型, 以登录方法为例
import (
"github.com/gin-gonic/gin"
"net/http"
"gopkg.in/go-playground/validator.v8"
)
func Login(c *gin.Context) {
var loginRequest LoginRequest
if err := c.ShouldBind(&loginRequest); err == nil {
// 参数接收正确, 进行登录操作
c.JSON(http.StatusOK, loginRequest)
}else{
// 验证错误
c.JSON(http.StatusUnprocessableEntity, gin.H{
"message": loginRequest.GetError(err.(validator.ValidationErrors)), // 注意这里要将 err 进行转换
})
}
}
这样, 当验证错误的时候, 我们就可以返回自己定义的错误提示信息了.
如果有帮到你, 请点个赞吧.