跳至主要內容

验证器

Ryan SU大约 6 分钟

Validator 使用

Simple Admin Tools 集成 validatoropen in new window

只需要在 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_addrIPv6 网际协议地址
ip_addrIP 网际协议地址
ipv4IPv4 网际协议地址
ipv6IPv6 网际协议地址
mac媒体访问控制地址 MAC
tcp4_addrTCPv4 传输控制协议地址
tcp6_addrTCPv6 传输控制协议地址
tcp_addrTCP 传输控制协议地址
udp4_addrUDPv4 用户数据报协议地址
udp6_addrUDPv6 用户数据报协议地址
udp_addrUDP 用户数据报协议地址
unix_addrUnix 域套接字端点地址
uriURI 字符串
urlURL 字符串
url_encodedURL 编码
urn_rfc2141URN RFC 2141 字符串

字符串

标签描述
alpha仅包含字母
alphanum包含字母和数字
alphanumunicode包含字母和数字(Unicode)
alphaunicode仅包含字母(Unicode)
asciiASCII 字符串
boolean布尔值
contains包含
containsany包含任意字符
containsrune包含指定字符
endsnotwith不以指定字符结尾
endswith以指定字符结尾
excludes不包含
excludesall不包含任意字符
excludesrune不包含指定字符
lowercase全部小写
multibyte多字节字符
number在 doc.go 中未记录
numeric数字
printascii可打印的 ASCII 字符串
startsnotwith不以指定字符开头
startswith以指定字符开头
uppercase全部大写

格式

标签描述
base64Base64 字符串
base64urlBase64URL 字符串
bic商业标识代码 (ISO 9362)
bcp47_language_tag语言标签 (BCP 47)
btc_addr比特币地址
btc_addr_bech32比特币 Bech32 地址 (segwit)
credit_card信用卡号
datetime日期时间
e164e164 格式的电话号码
email电子邮件字符串
eth_addr以太坊地址
hexadecimal十六进制字符串
hexcolor十六进制颜色字符串
hslHSL 字符串
hslaHSLA 字符串
htmlHTML 标签
html_encodedHTML 编码
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)
jsonJSON
jwtJSON Web Token (JWT)
latitude纬度
longitude经度
postcode_iso3166_alpha2邮政编码
postcode_iso3166_alpha2_field邮政编码
rgbRGB 字符串
rgbaRGBA 字符串
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
md4MD4 哈希
md5MD5 哈希
sha256SHA256 哈希
sha384SHA384 哈希
sha512SHA512 哈希
ripemd128RIPEMD-128 哈希
ripemd128RIPEMD-160 哈希
tiger128TIGER128 哈希
tiger160TIGER160 哈希
tiger192TIGER192 哈希
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