Go Gin 可以使用多种方法进行参数校验,以下为其中几种方法:
- 使用 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
}
- 使用 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
}
- 使用自定义验证器
如果您需要更高级的校对,可以使用自定义验证器。下面的示例演示了如何使用自定义验证器来验证用户名密码:
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 状态。