验证器 说明 示例
- 忽略字段 binding:"-"
required 必填字段 binding:“required”
min 最小长度 binding:“min=10”
max 最大长度 binding:“max=10”
| 或 binding:"rgb
structonly 如果有嵌套,可以决定只验证结构体上的 binding:“structonly”
omitempty 省略空,如果为空,则不会继续验证该字段上其他的规则,只有不为空才会继续验证其他的
len 长度 binding:“len=10”
eq 等于 binding:“eq=10”
ne 不等于 binding:“ne=10”
gt 大于 binding:“gt=10”
gte 大于等于 binding:“gte=10”
lt 小于 binding:“lt=10”
lte 小于等于 binding:“lte=10”
eqfield 等于其他字段的值 Password string binding:"eqfield=ConfirmPassword"
nefield 不等于其他字段的值
eqcsfield 类似eqfield,它会验证相对于顶层结构提供的字段 binding:"eqcsfield = InnerStructField.Field
necsfield
gtfield 大于其他字段的值
gtefield
gtcsfield
gtecsfield
ltfield 小于其他字段的值
ltefield
ltcsfield
ltecsfield
alpha 字符串值仅包含字母字符
alphanum 字符串值仅包含字母数字字符
numeric 字符串值包含基本数字值。基本不包括指数等…
hexadecimal 字符串值包含有效的十六进制
hexcolor 验证字符串值包含有效的十六进制颜色, 包括井号(#)
rgb 字符串值包含有效的rgb颜色
rgba 字符串值包含有效的rgba颜色
HSL 字符串值包含有效的hsl颜色
hsla 字符串值包含有效的hsla颜色
email 字符串值包含有效的电子邮件
url 字符串值包含有效的网址,必须包含http://等
uri 字符串值包含有效的uri. 它将接受golang请求uri接受的任何uri
base64 字符串值包含有效的base64值
contains 字符串值包含子字符串值, contains=@
containsany 包含所有,containsany =!@#?
containsrune 字符串值包含提供的符号 containsrune = @
excludes 字符串值不包含子字符串值,excludes = @
excludeall 排除所有
excluderune 字符串值不包含提供的符号,excluderune = @
isbn 国际标准书号,验证字符串值包含有效的isbn10或isbn13值
isbn10 国际标准书号10, 验证字符串值包含有效的isbn10值
isbn13 国际标准书号13, 字符串值包含有效的isbn13值
uuid 字符串值包含有效的UUID
uuid3 字符串值包含有效的版本3 UUID
uuid4 字符串值包含有效的版本5 UUID
uuid5 字符串值包含有效的版本5 UUID
ascii 字符串值仅包含ASCII字符. 注意:如果字符串为空, 则验证为true
asciiprint 字符串值仅包含可打印的ASCII字符. 注意: 如果字符串为空,则验证为true
multibyte 字符串值包含一个或多个多字节字符。注意:如果字符串为空,则验证为true
datauri 字符串值包含有效的DataURI。注意:这还将验证数据部分是有效的base64
latitude 纬度,字符串值包含有效的纬度
longitude 经度,字符串值包含有效的经度
ssn 字符串值包含有效的美国社会安全号码
ip 字符串值包含有效的IP地址
ipv4 字符串值包含有效的v4 IP地址
ipv6 字符串值包含有效的v6 IP地址
cidr 字符串值包含有效的CIDR地址
cidrv4 字符串值包含有效的CIDR地址
cidrv6 字符串值包含有效的v6 CIDR地址
tcp_addr 字符串值包含有效的可解析TCP地址
dive 嵌套验证
- 基础绑定和验证
在 Gin 中,可以通过绑定标签 (binding) 来指定如何从请求中提取数据,并通过验证标签 (validate) 来验证数据。常见的绑定方法包括 JSON、表单、查询参数等。
1.1 JSON 绑定
用于从请求体中解析 JSON 数据。
go
type User struct {
Name string `json:"name" binding:"required"`
Email string `json:"email" binding:"required,email"`
Age int `json:"age" binding:"gte=0,lte=130"`
Password string `json:"password" binding:"required,min=6"`
}
func main() {
router := gin.Default()
router.POST("/users", func(c *gin.Context) {
var user User
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
c.JSON(200, gin.H{"user": user})
})
router.Run()
}
1.2 表单绑定
用于解析表单数据(包括 URL 编码的表单和 Multipart 表单)。
go
复制代码
type Login struct {
Username string `form:"username" binding:"required"`
Password string `form:"password" binding:"required"`
}
func main() {
router := gin.Default()
router.POST("/login", func(c *gin.Context) {
var login Login
if err := c.ShouldBind(&login); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
c.JSON(200, gin.H{"login": login})
})
router.Run()
}
1.3 查询参数绑定
用于解析 URL 查询参数。
type Query struct {
Page int `form:"page" binding:"required,min=1"`
Size int `form:"size" binding:"required,min=1"`
Query string `form:"query" binding:"required"`
}
func main() {
router := gin.Default()
router.GET("/search", func(c *gin.Context) {
var query Query
if err := c.ShouldBindQuery(&query); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
c.JSON(200, gin.H{"query": query})
})
router.Run()
}
- 验证标签
Gin 的验证功能基于 validator 包,可以使用多种验证标签来检查字段的有效性。以下是一些常用的验证标签及其说明:
required:字段是必填的。
email:验证字段是否是有效的电子邮件地址。
min:验证字段的值是否大于或等于指定的最小值(适用于数字和字符串)。
max:验证字段的值是否小于或等于指定的最大值(适用于数字和字符串)。
gte:验证字段的值是否大于或等于指定的最小值(适用于数字)。
lte:验证字段的值是否小于或等于指定的最大值(适用于数字)。
len:验证字段的长度是否等于指定值(适用于字符串、切片、数组、map)。
oneof:验证字段的值是否在指定的枚举值中。
uuid:验证字段是否是有效的 UUID。
ipv4 / ipv6 / ip:验证字段是否是有效的 IP 地址。
url:验证字段是否是有效的 URL。
- 自定义验证
可以通过实现 validator.Func 接口来定义自定义验证函数。以下是一个示例:
go
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"net/http"
"regexp"
)
// 定义自定义验证函数
var validUsername validator.Func = func(fl validator.FieldLevel) bool {
if username, ok := fl.Field().Interface().(string); ok {
return regexp.MustCompile(`^[a-zA-Z0-9_]+$`).MatchString(username)
}
return false
}
type User struct {
Username string `json:"username" binding:"required,validUsername"`
Email string `json:"email" binding:"required,email"`
}
func main() {
router := gin.Default()
// 获取默认验证器
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
// 注册自定义验证函数
v.RegisterValidation("validUsername", validUsername)
}
router.POST("/users", func(c *gin.Context) {
var user User
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"user": user})
})
router.Run()
}
- 嵌套结构体验证
Gin 也支持对嵌套结构体进行验证。例如:
type Address struct {
Street string `json:"street" binding:"required"`
City string `json:"city" binding:"required"`
}
type User struct {
Name string `json:"name" binding:"required"`
Email string `json:"email" binding:"required,email"`
Address Address `json:"address" binding:"required,dive"`
}
func main() {
router := gin.Default()
router.POST("/users", func(c *gin.Context) {
var user User
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"user": user})
})
router.Run()
}
在以上示例中,dive 标签用于指示验证器深入验证嵌套结构体的字段。