详解Go工具库go-playground/validator在Gin框架中的使用教程
在Go语言的Web开发中,Gin框架因其高性能和易用性而广受欢迎。然而,处理请求参数的验证是一个常见的需求。go-playground/validator
是一个功能强大的验证库,可以与Gin框架无缝集成,帮助开发者轻松实现请求参数的验证。
本教程将详细介绍如何在Gin框架中使用go-playground/validator
,并通过多个示例展示其用法。
安装
首先,确保你已经安装了Gin和go-playground/validator
库。如果没有,可以使用以下命令进行安装:
go get -u github.com/gin-gonic/gin
go get -u github.com/go-playground/validator/v10
基本使用
示例1:简单的字符串验证
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type User struct {
Name string `json:"name" binding:"required,min=3,max=10"`
Age int `json:"age" binding:"required,gte=18,lte=60"`
}
func main() {
router := gin.Default()
router.POST("/user", 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{"message": "User is valid!"})
})
router.Run(":8080")
}
代码注解:
User
结构体中定义了两个字段:Name
和Age
。Name
字段通过binding:"required,min=3,max=10"
标签指定了验证规则:必填,长度在3到10之间。Age
字段通过binding:"required,gte=18,lte=60"
标签指定了验证规则:必填,值在18到60之间。c.ShouldBindJSON(&user)
用于将请求的JSON数据绑定到User
结构体,并自动进行验证。
示例2:自定义验证函数
package main
import (
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"net/http"
)
type User struct {
Name string `json:"name" binding:"required,min=3,max=10"`
Age int `json:"age" binding:"required,gte=18,lte=60"`
Email string `json:"email" binding:"required,email"`
}
func validateEmail(fl validator.FieldLevel) bool {
email := fl.Field().String()
// 自定义邮箱验证逻辑
return len(email) > 5 && len(email) < 50
}
func main() {
router := gin.Default()
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterValidation("email", validateEmail)
}
router.POST("/user", 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{"message": "User is valid!"})
})
router.Run(":8080")
}
代码注解:
validateEmail
函数是一个自定义的验证函数,用于验证邮箱地址的长度。v.RegisterValidation("email", validateEmail)
将自定义验证函数注册到验证器中,并命名为email
。Email
字段通过binding:"required,email"
标签指定了验证规则:必填,并使用自定义的邮箱验证函数。
示例3:嵌套结构体的验证
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type Address struct {
City string `json:"city" binding:"required"`
Country string `json:"country" binding:"required"`
}
type User struct {
Name string `json:"name" binding:"required,min=3,max=10"`
Age int `json:"age" binding:"required,gte=18,lte=60"`
Address Address `json:"address" binding:"required"`
}
func main() {
router := gin.Default()
router.POST("/user", 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{"message": "User is valid!"})
})
router.Run(":8080")
}
代码注解:
Address
结构体嵌套在User
结构体中,用于表示用户的地址信息。Address
结构体的字段通过binding:"required"
标签指定了验证规则:必填。User
结构体的Address
字段通过binding:"required"
标签指定了验证规则:必填。
示例4:使用多个验证规则
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type User struct {
Name string `json:"name" binding:"required,min=3,max=10"`
Age int `json:"age" binding:"required,gte=18,lte=60"`
Email string `json:"email" binding:"required,email"`
Phone string `json:"phone" binding:"required,len=11"`
}
func main() {
router := gin.Default()
router.POST("/user", 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{"message": "User is valid!"})
})
router.Run(":8080")
}
代码注解:
Phone
字段通过binding:"required,len=11"
标签指定了验证规则:必填,长度必须为11。- 通过组合不同的验证规则,可以实现更复杂的验证逻辑。
go-playground/validator
默认支持的参数、验证方式、比较参数
1. 常用验证参数
required
:字段必填。omitempty
:字段可以为空。min
:最小值(适用于数字、字符串长度)。max
:最大值(适用于数字、字符串长度)。len
:固定长度(适用于字符串、数组、切片)。eq
:等于某个值。ne
:不等于某个值。gt
:大于某个值。gte
:大于等于某个值。lt
:小于某个值。lte
:小于等于某个值。
2. 常用验证方式
email
:验证邮箱格式。url
:验证URL格式。uuid
:验证UUID格式。alpha
:验证字符串是否只包含字母。alphanum
:验证字符串是否只包含字母和数字。numeric
:验证字符串是否只包含数字。hexadecimal
:验证字符串是否为十六进制格式。hexcolor
:验证字符串是否为十六进制颜色格式。rgb
:验证字符串是否为RGB颜色格式。rgba
:验证字符串是否为RGBA颜色格式。hsl
:验证字符串是否为HSL颜色格式。hsla
:验证字符串是否为HSLA颜色格式。ip
:验证字符串是否为IP地址格式。ipv4
:验证字符串是否为IPv4地址格式。ipv6
:验证字符串是否为IPv6地址格式。cidr
:验证字符串是否为CIDR格式。cidrv4
:验证字符串是否为CIDRv4格式。cidrv6
:验证字符串是否为CIDRv6格式。tcp_addr
:验证字符串是否为TCP地址格式。tcp4_addr
:验证字符串是否为TCPv4地址格式。tcp6_addr
:验证字符串是否为TCPv6地址格式。udp_addr
:验证字符串是否为UDP地址格式。udp4_addr
:验证字符串是否为UDPv4地址格式。udp6_addr
:验证字符串是否为UDPv6地址格式。ip_addr
:验证字符串是否为IP地址格式。ip4_addr
:验证字符串是否为IPv4地址格式。ip6_addr
:验证字符串是否为IPv6地址格式。unix_addr
:验证字符串是否为Unix地址格式。mac
:验证字符串是否为MAC地址格式。isbn
:验证字符串是否为ISBN格式。isbn10
:验证字符串是否为ISBN-10格式。isbn13
:验证字符串是否为ISBN-13格式。eth_addr
:验证字符串是否为以太网地址格式。btc_addr
:验证字符串是否为比特币地址格式。btc_addr_bech32
:验证字符串是否为比特币Bech32地址格式。base64
:验证字符串是否为Base64编码格式。base64url
:验证字符串是否为Base64 URL编码格式。ascii
:验证字符串是否只包含ASCII字符。printascii
:验证字符串是否只包含可打印的ASCII字符。multibyte
:验证字符串是否包含多字节字符。datauri
:验证字符串是否为Data URI格式。latitude
:验证字符串是否为纬度格式。longitude
:验证字符串是否为经度格式。ssn
:验证字符串是否为社会安全号码(SSN)格式。hostname
:验证字符串是否为主机名格式。lowercase
:验证字符串是否为小写。uppercase
:验证字符串是否为大写。unique
:验证切片或数组中的元素是否唯一。oneof
:验证字段是否为一组预定义值之一。
3. 常用比较参数
eqfield
:验证字段是否等于另一个字段。nefield
:验证字段是否不等于另一个字段。gtfield
:验证字段是否大于另一个字段。gtefield
:验证字段是否大于等于另一个字段。ltfield
:验证字段是否小于另一个字段。ltefield
:验证字段是否小于等于另一个字段。eqcsfield
:验证字段是否等于另一个结构体中的字段。necsfield
:验证字段是否不等于另一个结构体中的字段。gtcsfield
:验证字段是否大于另一个结构体中的字段。gtecsfield
:验证字段是否大于等于另一个结构体中的字段。ltcsfield
:验证字段是否小于另一个结构体中的字段。ltecsfield
:验证字段是否小于等于另一个结构体中的字段。
通过这些验证参数、验证方式和比较参数,开发者可以灵活地定义和组合验证规则,以满足各种复杂的验证需求。
版权声明:本文为原创文章,版权归 全栈开发技术博客 所有。
本文链接:https://www.lvtao.net/dev/go-playground-validator.html
转载时须注明出处及本声明