Gin 如何自定义验证器?

10 min read

在 Gin 框架中,可以自定义验证器来验证请求参数是否合法。以下是自定义验证器的步骤:

  1. 创建结构体类型

首先,创建一个结构体类型,用于表示需要验证的请求参数,结构体中的字段类型需要与请求参数的类型一致。例如,如果需要验证一个用户注册的请求参数,可以创建以下结构体:

type RegisterRequest struct {
    Username string `json:"username" binding:"required"`
    Password string `json:"password" binding:"required"`
    Email    string `json:"email" binding:"required,email"`
}

上述结构体表示一个用户名、密码、邮箱均为必填项的注册请求参数,并且邮箱必须符合电子邮件地址的格式。

  1. 创建验证器函数

其次,需要创建一个验证器函数,用于验证请求参数是否有效。验证器函数接收一个参数,即需要验证的请求参数结构体,如果验证成功,直接返回,否则应该返回一个错误。例如,可以创建以下验证器函数:

func ValidateRegisterRequest(req *RegisterRequest) error {
    if req.Username == "" {
        return errors.New("Username is required")
    }
    if req.Password == "" {
        return errors.New("Password is required")
    }
    if req.Email == "" {
        return errors.New("Email is required")
    }
    if !strings.Contains(req.Email, "@") {
        return errors.New("Invalid email address")
    }
    return nil
}

以上实现了一个基本的验证器函数,通过判断请求参数是否为空、邮箱是否包含 "@" 符号来验证请求参数是否有效。

  1. 在路由处理函数中使用验证器

最后,在路由处理函数中使用验证器函数,当请求参数无效时返回一个错误响应。例如:

func registerHandler(c *gin.Context) {
    var req RegisterRequest
    if err := c.ShouldBindJSON(&req); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    if err := ValidateRegisterRequest(&req); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    // 处理注册逻辑
    c.Status(http.StatusOK)
}

以上代码将请求参数绑定到 RegisterRequest 结构体中,并且使用 ValidateRegisterRequest 函数验证请求参数是否有效。如果请求参数无效,返回一个错误响应,否则处理注册逻辑。