Golang使用validator进行数据校验及自定义翻译器
Golang使用validator进行数据校验及自定义翻译器
包下载:go get github.com/go-playground/validator/v10
https://pkg.go.dev/github.com/go-playground/validator/v10#pkg-overview
一、概述
在接口开发经常会遇到一个问题是后端需要写大量的繁琐代码进行数据校验,所以就想着有没有像前端校验一样写规则进行匹配校验,然后就发现了validator包,一个比较强大的校验工具包下面是一些学习总结,详细内容可以查看validator
二、操作符说明
标记 | 标记说明 |
---|---|
, | 多操作符分割 |
| | 或操作 |
- | 跳过字段验证 |
三、常用标记说明
比较运算符
运算符 | 运算描述 | 例子 |
---|---|---|
eq | 等于 | Field validate:"eq=0" |
gt | 大于 | Field validate:"gt=0" |
gte | 大于等于 | Field validate:"gte=0" |
lt | 小于 | Field validate:"lt=0" |
lte | 小于等于 | Field validate:"lte=0" |
ne | 不等于 | Field validate:"ne=0" |
字段验证运算
运算符 | 运算描述 | 例子 |
---|---|---|
eqcsfield | 跨不同结构体字段相等 | Struct1.Field validate:"eqcsfield=Struct2.Field2" |
eqfield | 同一结构体字段相等 | Field validate:"eqfield=Field2" |
fieldcontains | 包含字段 | |
fieldexcludes | 未包含字段 | |
gtcsfield | 跨不同结构体字段大于 | Struct1.Field validate:"gtcsfield=Struct2.Field2" |
gtecsfield | 跨不同结构体字段大于等于 | Struct1.Field validate:"gtecsfield=Struct2.Field2" |
gtefield | 同一结构体字段大于等于 | Field validate:"gtefield=Field2" |
gtfield | 同一结构体字段相等 | Field validate:"gtfield=Field2" |
ltcsfield | 跨不同结构体字段小于 | Struct1.Field validate:"ltcsfield=Struct2.Field2" |
ltecsfield | 跨不同结构体字段小于等于 | Struct1.Field validate:"ltecsfield=Struct2.Field2" |
ltefield | 同一个结构体字段小于等于 | Field validate:"ltefield=Field2" |
ltfield | 同一个结构体字段小于 | Field validate:"ltfield=Field2" |
necsfield | 跨不同结构体字段不想等 | Struct1.Field validate:"necsfield=Struct2.Field2" |
nefield | 同一个结构体字段不想等 | Field validate:"nefield=Field2" |
网络字段验证运算
运算符 | 运算描述 | 例子 |
---|---|---|
cidr | 有效 CIDR | |
cidrv4 | 有效 CIDRv4 | |
cidrv6 | 有效 CIDRv6 | |
datauri | 是否有效 URL | |
fqdn | 有效完全合格的域名 (FQDN) | |
hostname | 是否站点名称 RFC 952 | |
hostname_port | 是否站点端口 | |
ip | 是否包含有效 IP | Field validate:"ip" |
ip4_addr | 是否有效 IPv4 | |
ip6_addr | 是否有效 IPv6 | |
ip_addr | 是否有效 IP | |
ipv4 | 是否有效 IPv4 | Field validate:"ipv4" |
ipv6 | 是否有效 IPv6 | |
mac | 是否媒体有效控制有效 MAC 地址 | |
tcp4_addr | 是否有效 TCPv4 传输控制协议地址 | |
tcp6_addr | 是否有效 TCPv6 传输控制协议地址 | |
tcp_addr | 是否有效 TCP 传输控制协议地址 | |
udp4_addr | 是否有效 UDPv4 用户数据报协议地 | |
udp6_addr | 是否有效 UDPv6 用户数据报协议地 | |
udp_addr | 是否有效 UDPv 用户数据报协议地 | |
unix_addr | Unix 域套接字端点地址 | |
uri | 是否包含有效的 URI | Field validate:"uri" |
url | 是否包含有效的 URL | Field validate:"url" |
字符串验证运算
运算符 | 运算描述 | 例子 |
---|---|---|
alpha | 是否全部由字母组成的 | |
alphanum | 是否全部由数字组成的 | Field validate:"alphanum" |
alphanumunicode | 是否全部由 unicode 字母数字组成 | Field validate:"alphanumunicode" |
alphaunicode | 是否全部由 unicode 字母组成 | Field validate:"alphaunicode" |
ascii | ASCII | |
contains | 是否包含全部 | Field validate:"contains=@" |
endswith | 尾部是否以此字符结束 | Field validate:"endswith=abc" |
lowercase | 是否全小写字符组成 | Field validate:"lowercase" |
multibyte | 是否多字节字符 | |
number | 是否数字 | |
numeric | 是否包含基本的数值 | Field validate:"numeric" |
printascii | 是否可列印的 ASCII | |
startswith | 开头是否以此字符开始 | Field validate:"startswith=abc" |
uppercase | 是否全大写字符组成 | Field validate:"uppercase" |
containsfield | 字段包含另一个字段 | Field validate:"containsfield=Field2" |
excludesfield | 字段不包含另一个字段 | Field validate:"excludesfield=Field2" |
hexadecimal | 字符串值是否包含有效的十六进制 | Field validate:"hexadecimal" |
hexcolor | 字符串值是否包含有效的十六进制颜色 | Field validate:"hexcolor" |
containsany | 字符串值包含子字符串值中的任何字符 | Field validate:"containsany=abc" |
containsrune | 字符串值包含提供的特殊符号值 | Field validate:"containsrune=☢" |
excludes | 字符串值不包含子字符串值 | Field validate:"excludes=@" |
excludesall | 字符串值不包含任何子字符串值 | Field validate:"excludesall=abc" |
excludesrune | 字符串值不包含提供的特殊符号值 | Field validate:"containsrune=☢" |
excluded_with | ||
excluded_with_all | ||
excluded_without | ||
excluded_without_all |
数据格式验证运算
运算符 | 运算描述 | 例子 |
---|---|---|
base64 | 是否 Base64 | Field validate:"base64" |
base64url | 是否 Base64UR | |
btc_addr | 是否 Bitcoin 地址 | |
btc_addr_bech32 | 是否 Bitcoin Bech32 地址 | |
datetime | 是否有效 Datetime | Field validate:"datetime" |
是否有效 E-mail | Field validate:"email" |
|
html | 是否有效 HTML 标签 | |
json | 是否有效 JSON | Field validate:"json" |
rgb | 是否有效 RGB | |
rgba | 是否有效 RGBA | |
uuid | 是否有效通用唯一标识符 |
其他验证运算
运算符 | 运算描述 | 例子 |
---|---|---|
dir | 是否有效目录 | |
file | 是否有效文件目录 | Field validate:"file" |
isdefault | 是默认值 | Field validate:"isdefault=0" |
len | 指定长度 | Field validate:"len=0" |
max | 最大值 | Field validate:"max=1" |
min | 最小值 | Field validate:"min=1" |
required | 必须传入 | Field或Struct validate:"required" |
required_if | Field validate:"required_if=Field1 Value" |
|
required_unless | ||
unique | 唯一的 | Field validate:"unique" |
required_with | 其他字段其中一个不为空且当前字段不为空 | Field validate:"required_with=Field1 Field2" |
required_with_all | 其他所有字段不为空且当前字段不为空 | Field validate:"required_with_all=Field1 Field2" |
required_without | 其他字段其中一个为空且当前字段不为空 | Field `validate:"required_without=Field1 Field2" |
required_without_all | 其他所有字段为空且当前字段不为空 | Field validate:"required_without_all=Field1 Field2" |
oneof | 其中之一 | Field validate:"oneof=5 7 9" |
omitempty | 空时忽略 | Field或Struct validate:"omitempty" |
structonly | 仅验证结构体,不验证任何结构体字段 | Struct validate:"structonly" |
nostructlevel | 不运行任何结构级别的验证 | Struct validate:"nostructlevel" |
dive | 向下延伸验证,多层向下需要多个dive标记 | [][]string validate:"gt=0,dive,len=1,dive,required" |
dive Keys & EndKeys | 与dive同时使用,用于对map对象的键的和值的验证,keys为键,endkeys为值 | map[string]string validate:"gt=0,dive,keys,eq=1|eq=2,endkeys,required" |
Aliases:
Tag | Description |
---|---|
iscolor | hexcolor|rgb|rgba|hsl|hsla |
country_code | iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric |
四、标记使用注意
1、当搜索条件与特殊标记冲突时,如:逗号(,),或操作(|),中横线(-)等则需要使用 UTF-8十六进制表示形式
例:
1 | Copytype Test struct { |
2、可通过validationErrors := errs.(validator.ValidationErrors)获取错误对象自定义返回响应错误
3、自定义校验结果翻译
1 | // 初始化翻译器 |
五、使用示例
1 | import ( |
1 | package main |
dive
dive用于深入到切片、数组和map中进行数据校验
Example#1
[][]
1 | string with validation tag "gt=0,dive,len=1,dive,required" |
Example#2
1 | string with validation tag "gt=0,dive,dive,required" |
六、gin框架中使用验证翻译器
1. 定义错误翻译器
1 | //validator.go |
使用
1 | //router.go |
2. 定义错误翻译器2
1 | package validate |
测试
1 | package validate |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Blank!
评论