驗證器 說明 示例
- 忽略字段 binding:"-"
required 必填字段 binding:“required”
min 最小長度 binding:“min=10”
max 最大長度 binding:“max=10”
| 或 binding:"rgb
structonly 如果有嵌套容诬,可以決定只驗證結(jié)構(gòu)體上的 binding:“structonly”
omitempty 省略空搀别,如果為空碑隆,則不會繼續(xù)驗證該字段上其他的規(guī)則猴贰,只有不為空才會繼續(xù)驗證其他的
len 長度 binding:“l(fā)en=10”
eq 等于 binding:“eq=10”
ne 不等于 binding:“ne=10”
gt 大于 binding:“gt=10”
gte 大于等于 binding:“gte=10”
lt 小于 binding:“l(fā)t=10”
lte 小于等于 binding:“l(fā)te=10”
eqfield 等于其他字段的值 Password string binding:"eqfield=ConfirmPassword"
nefield 不等于其他字段的值
eqcsfield 類似eqfield麦轰,它會驗證相對于頂層結(jié)構(gòu)提供的字段 binding:"eqcsfield = InnerStructField.Field
necsfield
gtfield 大于其他字段的值
gtefield
gtcsfield
gtecsfield
ltfield 小于其他字段的值
ltefield
ltcsfield
ltecsfield
alpha 字符串值僅包含字母字符
alphanum 字符串值僅包含字母數(shù)字字符
numeric 字符串值包含基本數(shù)字值×蠛祝基本不包括指數(shù)等…
hexadecimal 字符串值包含有效的十六進(jìn)制
hexcolor 驗證字符串值包含有效的十六進(jìn)制顏色, 包括井號(#)
rgb 字符串值包含有效的rgb顏色
rgba 字符串值包含有效的rgba顏色
HSL 字符串值包含有效的hsl顏色
hsla 字符串值包含有效的hsla顏色
email 字符串值包含有效的電子郵件
url 字符串值包含有效的網(wǎng)址征椒,必須包含http://等
uri 字符串值包含有效的uri. 它將接受golang請求uri接受的任何uri
base64 字符串值包含有效的base64值
contains 字符串值包含子字符串值, contains=@
containsany 包含所有,containsany =湃累!@#勃救?
containsrune 字符串值包含提供的符號 containsrune = @
excludes 字符串值不包含子字符串值,excludes = @
excludeall 排除所有
excluderune 字符串值不包含提供的符號治力,excluderune = @
isbn 國際標(biāo)準(zhǔn)書號蒙秒,驗證字符串值包含有效的isbn10或isbn13值
isbn10 國際標(biāo)準(zhǔn)書號10, 驗證字符串值包含有效的isbn10值
isbn13 國際標(biāo)準(zhǔn)書號13, 字符串值包含有效的isbn13值
uuid 字符串值包含有效的UUID
uuid3 字符串值包含有效的版本3 UUID
uuid4 字符串值包含有效的版本5 UUID
uuid5 字符串值包含有效的版本5 UUID
ascii 字符串值僅包含ASCII字符. 注意:如果字符串為空, 則驗證為true
asciiprint 字符串值僅包含可打印的ASCII字符. 注意: 如果字符串為空,則驗證為true
multibyte 字符串值包含一個或多個多字節(jié)字符宵统。注意:如果字符串為空晕讲,則驗證為true
datauri 字符串值包含有效的DataURI。注意:這還將驗證數(shù)據(jù)部分是有效的base64
latitude 緯度马澈,字符串值包含有效的緯度
longitude 經(jīng)度瓢省,字符串值包含有效的經(jīng)度
ssn 字符串值包含有效的美國社會安全號碼
ip 字符串值包含有效的IP地址
ipv4 字符串值包含有效的v4 IP地址
ipv6 字符串值包含有效的v6 IP地址
cidr 字符串值包含有效的CIDR地址
cidrv4 字符串值包含有效的CIDR地址
cidrv6 字符串值包含有效的v6 CIDR地址
tcp_addr 字符串值包含有效的可解析TCP地址
dive 嵌套驗證
- 基礎(chǔ)綁定和驗證
在 Gin 中,可以通過綁定標(biāo)簽 (binding) 來指定如何從請求中提取數(shù)據(jù)痊班,并通過驗證標(biāo)簽 (validate) 來驗證數(shù)據(jù)勤婚。常見的綁定方法包括 JSON、表單涤伐、查詢參數(shù)等蛔六。
1.1 JSON 綁定
用于從請求體中解析 JSON 數(shù)據(jù)萌朱。
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 表單綁定
用于解析表單數(shù)據(jù)(包括 URL 編碼的表單和 Multipart 表單)憋他。
go
復(fù)制代碼
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 查詢參數(shù)綁定
用于解析 URL 查詢參數(shù)。
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()
}
- 驗證標(biāo)簽
Gin 的驗證功能基于 validator 包芙盘,可以使用多種驗證標(biāo)簽來檢查字段的有效性豆村。以下是一些常用的驗證標(biāo)簽及其說明:
required:字段是必填的液兽。
email:驗證字段是否是有效的電子郵件地址。
min:驗證字段的值是否大于或等于指定的最小值(適用于數(shù)字和字符串)掌动。
max:驗證字段的值是否小于或等于指定的最大值(適用于數(shù)字和字符串)四啰。
gte:驗證字段的值是否大于或等于指定的最小值(適用于數(shù)字)。
lte:驗證字段的值是否小于或等于指定的最大值(適用于數(shù)字)粗恢。
len:驗證字段的長度是否等于指定值(適用于字符串柑晒、切片、數(shù)組眷射、map)匙赞。
oneof:驗證字段的值是否在指定的枚舉值中。
uuid:驗證字段是否是有效的 UUID妖碉。
ipv4 / ipv6 / ip:驗證字段是否是有效的 IP 地址涌庭。
url:驗證字段是否是有效的 URL。
- 自定義驗證
可以通過實現(xiàn) validator.Func 接口來定義自定義驗證函數(shù)欧宜。以下是一個示例:
go
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"net/http"
"regexp"
)
// 定義自定義驗證函數(shù)
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()
// 獲取默認(rèn)驗證器
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
// 注冊自定義驗證函數(shù)
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()
}
- 嵌套結(jié)構(gòu)體驗證
Gin 也支持對嵌套結(jié)構(gòu)體進(jìn)行驗證坐榆。例如:
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 標(biāo)簽用于指示驗證器深入驗證嵌套結(jié)構(gòu)體的字段冗茸。