插件窝 干货文章 如何自定义Iris框架的数据验证错误信息使其更友好?

如何自定义Iris框架的数据验证错误信息使其更友好?

Iris 验证器 validation User 837    来源:    2025-03-15

在Iris框架中,数据验证错误信息可以通过自定义验证器或使用内置的验证器来实现更友好的错误提示。以下是一些步骤和方法来帮助你自定义Iris框架的数据验证错误信息:

1. 使用内置验证器并自定义错误信息

Iris框架内置了一些常用的验证器,你可以直接使用这些验证器,并通过自定义错误信息来使其更友好。

package main

import (
    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/recover"
    "github.com/kataras/iris/v12/mvc"
    "github.com/kataras/iris/v12/validation"
)

type User struct {
    Username string `json:"username" validate:"required,min=3,max=20"`
    Email    string `json:"email" validate:"required,email"`
}

func main() {
    app := iris.New()
    app.Use(recover.New())

    // 自定义验证错误信息
    validation.SetDefaultMessageFunc(func(fieldName, structFieldName string, rule validation.Rule) string {
        switch rule.Name() {
        case "required":
            return fieldName + " 是必填项,请填写。"
        case "min":
            return fieldName + " 的长度不能少于 " + rule.Params()[0] + " 个字符。"
        case "max":
            return fieldName + " 的长度不能超过 " + rule.Params()[0] + " 个字符。"
        case "email":
            return fieldName + " 必须是有效的电子邮件地址。"
        default:
            return fieldName + " 不符合要求。"
        }
    })

    mvc.New(app.Party("/user")).Handle(new(UserController))

    app.Listen(":8080")
}

type UserController struct{}

func (c *UserController) PostRegister(ctx iris.Context) {
    var user User
    if err := ctx.ReadJSON(&user); err != nil {
        ctx.StatusCode(iris.StatusBadRequest)
        ctx.JSON(iris.Map{"error": "无效的请求数据"})
        return
    }

    if err := validation.ValidateStruct(&user); err != nil {
        ctx.StatusCode(iris.StatusBadRequest)
        ctx.JSON(iris.Map{"error": err.Error()})
        return
    }

    ctx.JSON(iris.Map{"message": "用户注册成功"})
}

2. 自定义验证器

如果你需要更复杂的验证逻辑,可以自定义验证器,并在其中定义错误信息。

package main

import (
    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/recover"
    "github.com/kataras/iris/v12/mvc"
    "github.com/kataras/iris/v12/validation"
)

type User struct {
    Username string `json:"username"`
    Email    string `json:"email"`
}

func main() {
    app := iris.New()
    app.Use(recover.New())

    // 自定义验证器
    validation.RegisterValidation("valid_username", func(fieldValue interface{}, fieldName, structFieldName string, rule validation.Rule) bool {
        username, ok := fieldValue.(string)
        if !ok {
            return false
        }
        return len(username) >= 3 && len(username) <= 20
    })

    // 自定义验证错误信息
    validation.SetDefaultMessageFunc(func(fieldName, structFieldName string, rule validation.Rule) string {
        switch rule.Name() {
        case "valid_username":
            return fieldName + " 必须是3到20个字符之间的有效用户名。"
        default:
            return fieldName + " 不符合要求。"
        }
    })

    mvc.New(app.Party("/user")).Handle(new(UserController))

    app.Listen(":8080")
}

type UserController struct{}

func (c *UserController) PostRegister(ctx iris.Context) {
    var user User
    if err := ctx.ReadJSON(&user); err != nil {
        ctx.StatusCode(iris.StatusBadRequest)
        ctx.JSON(iris.Map{"error": "无效的请求数据"})
        return
    }

    // 使用自定义验证器
    if err := validation.ValidateStruct(&user,
        validation.Field(&user.Username, validation.Required, validation.By(validation.GetValidation("valid_username"))),
        validation.Field(&user.Email, validation.Required, validation.Email),
    ); err != nil {
        ctx.StatusCode(iris.StatusBadRequest)
        ctx.JSON(iris.Map{"error": err.Error()})
        return
    }

    ctx.JSON(iris.Map{"message": "用户注册成功"})
}

3. 使用第三方验证库

如果你觉得Iris内置的验证功能不够强大,可以考虑使用第三方验证库,如go-playground/validator,并结合Iris框架使用。

package main

import (
    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/recover"
    "github.com/kataras/iris/v12/mvc"
    "github.com/go-playground/validator/v10"
)

type User struct {
    Username string `json:"username" validate:"required,min=3,max=20"`
    Email    string `json:"email" validate:"required,email"`
}

var validate *validator.Validate

func main() {
    app := iris.New()
    app.Use(recover.New())

    validate = validator.New()

    mvc.New(app.Party("/user")).Handle(new(UserController))

    app.Listen(":8080")
}

type UserController struct{}

func (c *UserController) PostRegister(ctx iris.Context) {
    var user User
    if err := ctx.ReadJSON(&user); err != nil {
        ctx.StatusCode(iris.StatusBadRequest)
        ctx.JSON(iris.Map{"error": "无效的请求数据"})
        return
    }

    if err := validate.Struct(user); err != nil {
        ctx.StatusCode(iris.StatusBadRequest)
        ctx.JSON(iris.Map{"error": err.Error()})
        return
    }

    ctx.JSON(iris.Map{"message": "用户注册成功"})
}

总结

通过以上方法,你可以在Iris框架中自定义数据验证错误信息,使其更加友好和易于理解。你可以选择使用内置的验证器并自定义错误信息,或者自定义验证器来实现更复杂的验证逻辑。如果需要更强大的验证功能,还可以考虑使用第三方验证库。