验证器
2022/12/19大约 6 分钟
Validator 使用
Simple Admin Tools 集成 validator 库
只需要在 api 中结构声明中使用 validate tag 即可实现校验
// login request | 登录参数
// swagger:model LoginReq
LoginReq {
// User Name | 用户名
Username string `json:"username" validate:"alphanum,max=20"`
// Password | 密码
Password string `json:"password" validate:"max=30,min=6"`
// Captcha Id which store in redis | 验证码编号, 存在redis中
CaptchaId string `json:"captchaId" validate:"len=20"`
// The Captcha which users input | 用户输入的验证码
Captcha string `json:"captcha" validate:"len=5"`
}额外扩展
以下提供三个接口用于扩展 validator, 只需要在 main 函数中调用即可
// 注册额外语言
httpx.RegisterValidationTranslation(tag string, trans ut.Translator, registerFn validator.RegisterTranslationsFunc,
translationFn validator.TranslationFunc)
// 注册自定义方法
httpx.RegisterValidation(tag string, fn validator.Func)
// 设置自定义错误码
httpx.SetValidatorErrorCode(code int)例子
package main
import (
"flag"
"fmt"
"github.com/zeromicro/go-zero/rest/httpx"
"github.com/suyuan32/simple-admin-core/api/internal/config"
"github.com/suyuan32/simple-admin-core/api/internal/handler"
"github.com/suyuan32/simple-admin-core/api/internal/svc"
"github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/rest"
)
var configFile = flag.String("f", "etc/core.yaml", "the config file")
func main() {
flag.Parse()
var c config.Config
conf.MustLoad(*configFile, &c, conf.UseEnv())
server := rest.MustNewServer(c.RestConf, rest.WithCors("*"))
defer server.Stop()
ctx := svc.NewServiceContext(c)
handler.RegisterHandlers(server, ctx)
// 设置自定义错误码
httpx.SetValidatorErrorCode(5000)
fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
server.Start()
}注意: 添加 validate 标签后默认不能为空,若需要允许为空需要添加 omitempty
// Get token list request params | token列表请求参数
// swagger:model TokenListReq
TokenListReq {
PageInfo
// User's UUID | 用户的UUID
UUID string `json:"UUID" validate:"omitempty,len=36"`
// user's nickname | 用户的昵称
Nickname string `json:"nickname" validate:"omitempty,alphanumunicode,max=10"`
// User Name | 用户名
Username string `json:"username" validate:"omitempty,alphanum,max=20"`
// The user's email address | 用户的邮箱
Email string `json:"email" validate:"omitempty,email,max=100"`
}校验全自动生成
注意
在 goctls v0.3.1 之后支持 validate 全端自动生成,只需在 api 文件中声明 validate tag 即可
对于 string 类型, 支持 max, min, len, required 校验自动生成至 swagger, backend
对于 int - float 类型, 支持 lt,lte,gt,gte, required 校验自动生成至 swagger, backend
取消校验
若不需要校验可以在 Handler 中将 Parse 中的 isValidate 设置为 false
if err := httpx.Parse(r, &req, false); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}支持的校验类型
字段
| 标签 | 描述 |
|---|---|
| eqcsfield | 字段等于另一个字段(相对) |
| eqfield | 字段等于另一个字段 |
| fieldcontains | 在文档中未记录 |
| fieldexcludes | 在文档中未记录 |
| gtcsfield | 字段大于另一个相对字段 |
| gtecsfield | 字段大于或等于另一个相对字段 |
| gtefield | 字段大于或等于另一个字段 |
| gtfield | 字段大于另一个字段 |
| ltcsfield | 字段小于另一个相对字段 |
| ltecsfield | 字段小于或等于另一个相对字段 |
| ltefield | 字段小于或等于另一个字段 |
| ltfield | 字段小于另一个字段 |
| necsfield | 字段不等于另一个字段(相对) |
| nefield | 字段不等于另一个字段 |
网络
| 标签 | 描述 |
|---|---|
| cidr | 无类别域间路由 CIDR |
| cidrv4 | 无类别域间路由 CIDRv4 |
| cidrv6 | 无类别域间路由 CIDRv6 |
| datauri | 数据 URL |
| fqdn | 完全限定域名(FQDN) |
| hostname | 主机名 RFC 952 |
| hostname_port | 主机端口 |
| hostname_rfc1123 | 主机名 RFC 1123 |
| ip | 互联网协议地址 IP |
| ip4_addr | 互联网协议地址 IPv4 |
| ip6_addr | IPv6 网际协议地址 |
| ip_addr | IP 网际协议地址 |
| ipv4 | IPv4 网际协议地址 |
| ipv6 | IPv6 网际协议地址 |
| mac | 媒体访问控制地址 MAC |
| tcp4_addr | TCPv4 传输控制协议地址 |
| tcp6_addr | TCPv6 传输控制协议地址 |
| tcp_addr | TCP 传输控制协议地址 |
| udp4_addr | UDPv4 用户数据报协议地址 |
| udp6_addr | UDPv6 用户数据报协议地址 |
| udp_addr | UDP 用户数据报协议地址 |
| unix_addr | Unix 域套接字端点地址 |
| uri | URI 字符串 |
| url | URL 字符串 |
| url_encoded | URL 编码 |
| urn_rfc2141 | URN RFC 2141 字符串 |
字符串
| 标签 | 描述 |
|---|---|
| alpha | 仅包含字母 |
| alphanum | 包含字母和数字 |
| alphanumunicode | 包含字母和数字(Unicode) |
| alphaunicode | 仅包含字母(Unicode) |
| ascii | ASCII 字符串 |
| boolean | 布尔值 |
| contains | 包含 |
| containsany | 包含任意字符 |
| containsrune | 包含指定字符 |
| endsnotwith | 不以指定字符结尾 |
| endswith | 以指定字符结尾 |
| excludes | 不包含 |
| excludesall | 不包含任意字符 |
| excludesrune | 不包含指定字符 |
| lowercase | 全部小写 |
| multibyte | 多字节字符 |
| number | 在 doc.go 中未记录 |
| numeric | 数字 |
| printascii | 可打印的 ASCII 字符串 |
| startsnotwith | 不以指定字符开头 |
| startswith | 以指定字符开头 |
| uppercase | 全部大写 |
格式
| 标签 | 描述 |
|---|---|
| base64 | Base64 字符串 |
| base64url | Base64URL 字符串 |
| bic | 商业标识代码 (ISO 9362) |
| bcp47_language_tag | 语言标签 (BCP 47) |
| btc_addr | 比特币地址 |
| btc_addr_bech32 | 比特币 Bech32 地址 (segwit) |
| credit_card | 信用卡号 |
| datetime | 日期时间 |
| e164 | e164 格式的电话号码 |
| 电子邮件字符串 | |
| eth_addr | 以太坊地址 |
| hexadecimal | 十六进制字符串 |
| hexcolor | 十六进制颜色字符串 |
| hsl | HSL 字符串 |
| hsla | HSLA 字符串 |
| html | HTML 标签 |
| html_encoded | HTML 编码 |
| isbn | 国际标准书号 |
| isbn10 | 国际标准书号 10 位 |
| isbn13 | 国际标准书号 13 位 |
| iso3166_1_alpha2 | 两字母国家代码 (ISO 3166-1 alpha-2) |
| iso3166_1_alpha3 | 三字母国家代码 (ISO 3166-1 alpha-3) |
| iso3166_1_alpha_numeric | 数字国家代码 (ISO 3166-1 numeric) |
| iso3166_2 | 国家分区代码 (ISO 3166-2) |
| iso4217 | 货币代码 (ISO 4217) |
| json | JSON |
| jwt | JSON Web Token (JWT) |
| latitude | 纬度 |
| longitude | 经度 |
| postcode_iso3166_alpha2 | 邮政编码 |
| postcode_iso3166_alpha2_field | 邮政编码 |
| rgb | RGB 字符串 |
| rgba | RGBA 字符串 |
| ssn | 社会安全号码 SSN |
| timezone | 时区 |
| uuid | 通用唯一标识符 UUID |
| uuid3 | 通用唯一标识符 UUID v3 |
| uuid3_rfc4122 | 通用唯一标识符 UUID v3 RFC4122 |
| uuid4 | 通用唯一标识符 UUID v4 |
| uuid4_rfc4122 | 通用唯一标识符 UUID v4 RFC4122 |
| uuid5 | 通用唯一标识符 UUID v5 |
| uuid5_rfc4122 | 通用唯一标识符 UUID v5 RFC4122 |
| uuid_rfc4122 | 通用唯一标识符 UUID RFC4122 |
| md4 | MD4 哈希 |
| md5 | MD5 哈希 |
| sha256 | SHA256 哈希 |
| sha384 | SHA384 哈希 |
| sha512 | SHA512 哈希 |
| ripemd128 | RIPEMD-128 哈希 |
| ripemd128 | RIPEMD-160 哈希 |
| tiger128 | TIGER128 哈希 |
| tiger160 | TIGER160 哈希 |
| tiger192 | TIGER192 哈希 |
| semver | 语义化版本 2.0.0 |
| ulid | 可排序的通用唯一标识符 ULID |
比较
| 标签 | 描述 |
|---|---|
| eq | 等于 |
| gt | 大于 |
| gte | 大于等于 |
| lt | 小于 |
| lte | 小于等于 |
| ne | 不等于 |
其他
| 标签 | 描述 |
|---|---|
| dir | 目录路径 |
| file | 文件路径 |
| isdefault | 是否默认 |
| len | 长度 |
| max | 最大值 |
| min | 最小值 |
| oneof | 其中之一 |
| required | 必填项 |
| required_if | 如果满足条件则必填 |
| required_unless | 除非满足条件否则必填 |
| required_with | 如果与其他字段同时存在则必填 |
| required_with_all | 如果与所有其他字段同时存在则必填 |
| required_without | 如果与其他字段不同时存在则必填 |
| required_without_all | 如果与所有其他字段不同时存在则必填 |
| excluded_if | 如果满足条件则排除 |
| excluded_unless | 除非满足条件否则排除 |
| excluded_with | 如果与其他字段同时存在则排除 |
| excluded_with_all | 如果与所有其他字段同时存在则排除 |
| excluded_without | 如果与其他字段不同时存在则排除 |
| excluded_without_all | 如果与所有其他字段不同时存在则排除 |
| unique | 唯一值 |
别名
| 标签 | 描述 |
|---|---|
| iscolor | 是否为颜色,hexcolor|rgb|rgba|hsl|hsla |
| country_code | 是否为城市代码,iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric |