结构体
声明结构体 在结构体中添加字段标记来实现验证
举个栗子 🌰:
登录时必须包含 用户名 user
和 密码 password
则声明如下结构体
1
2
3
4
5
| // Binding from JSON
type Login struct {
User string `form:"user" json:"user" xml:"user" binding:"required"`
Password string `form:"password" json:"password" xml:"password" binding:"required"`
}
|
binding:"required"
声明字段必须含有
绑定数据
gin.Context
中 调用 bind
方法绑定数据 (Must bind, Should bind
都可)
1
2
3
4
5
| var json Login
if err := c.ShouldBindJSON(&json); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
|
调用
1
2
3
4
| if json.User != "manu" || json.Password != "123" {
c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
return
}
|
常用字段标记
Fields
Tag | 说明 |
---|
eqcsfield | Field Equals Another Field (relative) 必须等于 struct Other 中 Field 的值 例: binding:“eqcsfield=Other.Field”` |
eqfield | Field Equals Another Field 必须等于 Field 例: binding:“eqfield=Field”` |
fieldcontains | NOT DOCUMENTED IN doc.go |
fieldexcludes | NOT DOCUMENTED IN doc.go |
gtcsfield | Field Greater Than Another Relative Field 必须大于 struct Other 中 Field 的值 例: binding:“gtcsfield=Other.Field”` |
gtecsfield | Field Greater Than or Equal To Another Relative Field 必须大于等于 struct Other 中 Field 的值 例:binding:“gtecsfield=Other.Field”` |
gtefield | Field Greater Than or Equal To Another Field 必须大于等于 Field 的值 |
gtfield | Field Greater Than Another Field 必须大于 Field 的值 |
ltcsfield | Less Than Another Relative Field 必须小于 struct Other 中 Field 的值 例: binding:“ltcsfield=Other.Field”` |
ltecsfield | Less Than or Equal To Another Relative Field 必须小于等于 struct Other 中 Field 的值 例: binding:“ltecsfield=Other.Field”` |
ltefield | Less Than or Equal To Another Field 必须小于等于 Field 的值 |
ltfield | Less Than Another Field 必须小于 Field 的值 |
necsfield | Field Does Not Equal Another Field (relative) 必须不等于 struct Other 中 Field 的值 例: binding:“necsfield=Other.Field”` |
nefield | Field Does Not Equal Another Field 必须不等 Field |
Network:
Tag | Description |
---|
cidr | Classless Inter-Domain Routing CIDR |
cidrv4 | Classless Inter-Domain Routing CIDRv4 |
cidrv6 | Classless Inter-Domain Routing CIDRv6 |
datauri | Data URL |
fqdn | Full Qualified Domain Name (FQDN) |
hostname | Hostname RFC 952 |
hostname_port | HostPort |
hostname_rfc1123 | Hostname RFC 1123 |
ip | Internet Protocol Address IP |
ip4_addr | Internet Protocol Address IPv4 |
ip6_addr | Internet Protocol Address IPv6 |
ip_addr | Internet Protocol Address IP |
ipv4 | Internet Protocol Address IPv4 |
ipv6 | Internet Protocol Address IPv6 |
mac | Media Access Control Address MAC |
tcp4_addr | Transmission Control Protocol Address TCPv4 |
tcp6_addr | Transmission Control Protocol Address TCPv6 |
tcp_addr | Transmission Control Protocol Address TCP |
udp4_addr | User Datagram Protocol Address UDPv4 |
udp6_addr | User Datagram Protocol Address UDPv6 |
udp_addr | User Datagram Protocol Address UDP |
unix_addr | Unix domain socket end point Address |
uri | URI String |
url | URL String 验证字符串值包含有效的网址 |
url_encoded | URL Encoded |
urn_rfc2141 | Urn RFC 2141 String |
Strings:
Tag | Description |
---|
alpha | Alpha Only |
alphanum | Alphanumeric |
alphanumunicode | Alphanumeric Unicode |
alphaunicode | Alpha Unicode |
ascii | ASCII |
contains | Contains |
containsany | Contains Any |
containsrune | Contains Rune |
lowercase | Lowercase |
multibyte | Multi-Byte Characters |
number | NOT DOCUMENTED IN doc.go |
numeric | Numeric |
printascii | Printable ASCII |
startswith | Starts With |
uppercase | Uppercase |
Tag | Description |
---|
base64 | Base64 String |
base64url | Base64URL String |
btc_addr | Bitcoin Address |
btc_addr_bech32 | Bitcoin Bech32 Address (segwit) |
datetime | Datetime |
email | E-mail String 验证字符串是 email 格式 |
eth_addr | Ethereum Address |
hexadecimal | Hexadecimal String |
hexcolor | Hexcolor String |
hsl | HSL String |
hsla | HSLA String |
html | HTML Tags |
html_encoded | HTML Encoded |
isbn | International Standard Book Number |
isbn10 | International Standard Book Number 10 |
isbn13 | International Standard Book Number 13 |
json | JSON |
latitude | Latitude |
longitude | Longitude |
rgb | RGB String |
rgba | RGBA String |
ssn | Social Security Number SSN |
uuid | Universally Unique Identifier UUID |
uuid3 | Universally Unique Identifier UUID v3 |
uuid3_rfc4122 | Universally Unique Identifier UUID v3 RFC4122 |
uuid4 | Universally Unique Identifier UUID v4 |
uuid4_rfc4122 | Universally Unique Identifier UUID v4 RFC4122 |
uuid5 | Universally Unique Identifier UUID v5 |
uuid5_rfc4122 | Universally Unique Identifier UUID v5 RFC4122 |
uuid_rfc4122 | Universally Unique Identifier UUID RFC4122 |
Comparisons:
Tag | 说明 |
---|
eq | Equals 数字等于 n,或者或者数组、切片、map 的 len 值为 n,即包含的项目数 |
gt | Greater than 数字大于 n,或者或者数组、切片、map 的 len 值大于 n,即包含的项目数大于 n |
gte | Greater than or equal 数字大于或等于 n,或者或者数组、切片、map 的 len 值大于或等于 n,即包含的项目数大于或等于 n |
lt | Less Than 数字小于 n,或者或者数组、切片、map 的 len 值小于 n,即包含的项目数小于 n |
lte | Less Than or Equal 数字小于或等于 n,或者或者数组、切片、map 的 len 值小于或等于 n,即包含的项目数小于或等于 n |
ne | Not Equal 数字不等于 n,或者或者数组、切片、map 的 len 值不等于为 n,即包含的项目数不为 n,其和 eq 相反 |
Other:
Tag | Description |
---|
dir | Directory |
e164 | NOT DOCUMENTED IN doc.go |
endswith | Ends With |
excludes | Excludes |
excludesall | Excludes All 不能包含特殊字符, 注意用十六进制表示 例: binding:“excludesall=0x2C”` |
excludesrune | Excludes Rune |
file | File path |
isdefault | Is Default |
len | Length 字符长度必须等于 n,或者数组、切片、map 的 len 值为 n,即包含的项目数 |
max | Maximum 字符串最大长度 |
min | Minimum 字符串最小长度 |
oneof | One Of |
required | Required 必须 |
required_with | Required With |
required_with_all | Required With All |
required_without | Required Without |
required_without_all | Required Without All |
unique | Unique |
后记
官方验证事例 看这里
gin
中内置
数据验证库文档 看这里