从结构标记验证返回自定义错误消息

我正在使用带有 Gin 的 Go 1.17,我想在将数据发送到我的数据库之前实现结构验证。我以Gin 文档中的示例为例。


在结构中,我们可以声明不同的标签来验证一个字段,如下所示:


type User struct {

    FirstName      string `json:"first_name" binding:"required"`

    LastName       string `json:"last_name" binding:"required"`

    Age            uint8  `json:"age" binding:"gte=0,lte=130"`

    Email          string `json:"email" binding:"required,email"`

    FavouriteColor string `json:"favourite_color" binding:"iscolor"`

}

在处理程序中,我可以抓住这样的错误:


var u User

if err := c.ShouldBindWith(&u, binding.Query); err == nil {

    c.JSON(http.StatusOK, gin.H{"message": "Good Job"})

} else {

    c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})

}

错误消息将是:


{

    "error": "Key: 'User.FirstName' Error:Field validation for 'FirstName' failed on the 'required' tag\nKey: 'User.LastName' Error:Field validation for 'LastName' failed on the 'required' tag\nKey: 'User.Email' Error:Field validation for 'Email' failed on the 'required' tag\nKey: 'User.FavouriteColor' Error:Field validation for 'FavouriteColor' failed on the 'iscolor' tag"

}

错误消息太冗长了如何向用户返回更好的错误?我想对 json 响应进行建模,例如:


{

    "errors": [

        "first_name": "This field is required",

        "last_name": "This field is required",

        "age": "This field is required",

        "email": "Invalid email"

    ]

}


梦里花落0921
浏览 124回答 1
1回答

慕姐4208626

Gin gonic 使用该包github.com/go-playground/validator/v10执行绑定验证。如果验证失败,则返回的错误为validator.ValidationErrors.这没有明确提及,但在模型绑定和验证中它指出:Gin 使用 go-playground/validator/v10 进行验证。在此处查看有关标签使用的完整文档。该链接指向go-playground/validator/v10文档,您可以在其中找到段落Validation Functions Return Type error。您可以使用标准errors包来检查错误是否是那个,打开它,然后访问单个字段,即validator.FieldError. 由此,您可以构建任何您想要的错误消息。给定这样的错误模型:type ApiError struct {    Field string    Msg   string}你可以这样做:    var u User    err := c.BindQuery(&u);    if err != nil {        var ve validator.ValidationErrors        if errors.As(err, &ve) {            out := make([]ApiError, len(ve))            for i, fe := range ve {                out[i] = ApiError{fe.Field(), msgForTag(fe.Tag())}            }            c.JSON(http.StatusBadRequest, gin.H{"errors": out})        }        return    }使用辅助函数为您的验证规则输出自定义错误消息:func msgForTag(tag string) string {    switch tag {    case "required":        return "This field is required"    case "email":        return "Invalid email"    }    return ""}在我的测试中,这输出:{    "errors": [        {            "Field": "Number",            "Msg": "This field is required"        }    ]}PS:要获得带有动态键的 json 输出,您可以使用map[string]string固定结构模型来代替。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go