Go gin 如何做参数校验?

51 min read

Go Gin 可以使用多种方法进行参数校验,以下为其中几种方法:

  1. 使用 Bind() 函数和结构体

使用 Bind() 函数将请求绑定到结构体中,然后可以使用标准库中的表单验证方法来进行参数校验。

type InputData struct {
    Username string `form:"username" binding:"required,min=5,max=50"`
    Password string `form:"password" binding:"required,min=8,max=100"`
}

func HandleRequest(c *gin.Context) {
    var inputData InputData

    if err := c.Bind(&inputData); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    // Do something with valid inputData
}
  1. 使用 ShouldBindQuery() 函数和结构体

如果您的数据包含在 URL 查询中,则可以使用 ShouldBindQuery() 函数进行绑定和验证。仍然需要使用结构体来定义您的数据和绑定标记。

type InputData struct {
    Param1 string `form:"param1" binding:"required"`
    Param2 int    `form:"param2" binding:"required"`
    Param3 bool   `form:"param3" binding:"required"`
}

func HandleRequest(c *gin.Context) {
    var inputData InputData

    if err := c.ShouldBindQuery(&inputData); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    // Do something with valid inputData
}
  1. 使用自定义验证器

如果您需要更高级的校对,可以使用自定义验证器。下面的示例演示了如何使用自定义验证器来验证用户名密码:

func isValidUsernameAndPassword(fl validator.FieldLevel) bool {
    username := fl.Field().String()
    password := fl.Param()

    return strings.Contains(username, password)
}

type InputData struct {
    Username string `form:"username" binding:"required,min=5,max=50,isValidUsernameAndPassword=password"`
    Password string `form:"password" binding:"required,min=8,max=100"`
}

func HandleRequest(c *gin.Context) {
    var inputData InputData

    if err := c.Bind(&inputData); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    // Do something with valid inputData
}

在上面的示例中,isValidUsernameAndPassword 自定义验证器检查用户名和密码是否匹配。使用 binding 标记中的 isValidUsernameAndPassword=password 将其应用于用户名字段。如果密码出现在用户名中,则该验证器将返回 true,否则将返回 false。如果验证失败,则 Bind() 函数将返回错误,并返回 400 bad request 状态。