golang常用库:gorilla/mux-http路由库使用
golang常用库:配置文件解析库-viper使用
golang常用库:操作数据库的orm框架-gorm基本使用
golang常用库:字段参数验证库-validator使用
一、背景
在平常开发中,特别是在web应用开发中,为了验证输入字段的合法性,都会做一些验证操作。比如对用户提交的表单字段进行验证,或者对请求的API接口字段进行验证,验证字段的合法性,保证输入字段值的安全,防止用户的恶意请求。
一般的做法是用正则表达式,一个字段一个字段的进行验证。一个一个字段验证的话,写起来比较繁琐。那有没更好的方法,进行字段的合法性验证?有, 这就是下面要介绍的 validator 这个验证组件。
二、功能介绍
这个验证包 github.com/go-playground/validator 验证功能非常多。
标记之间特殊符号说明
, 注意validate:"lt=0,gt=100"-|
范围比较验证
范围验证: 切片、数组和map、字符串,验证其长度;数值,验证大小范围
validate:"lte=3"validate:"lte=0,gte=120"validate:"lt=3"validate:"lt=0,gt=120"validate:"len=2"validate:"max=2"validate:"min=2,max=10"validate:"ne=2"validate:"oneof=red green"
例子:
更多功能请参看文档 validator comparisons doc
字符串验证
validate:"contains=tom"validate:"excludes=tom"validate:"startswith=golang"validate:"startswith=world"
例子:
更多功能请参看文档 validator strings doc
字段验证
eqcsfield:跨不同结构体字段验证,比如说 Struct1 Filed1,与结构体Struct2 Field2相等,
- necsfield:跨不同结构体字段不相等
- eqfield:同一结构体字段验证相等,最常见的就是输入2次密码验证
nefield:同一结构体字段验证不相等
validate:"gtefiled=Field2"
更多功能请参看文档:validator Fields DOC
网络验证
validate:"ip"validate:"ipv4"validate:"ipv6"validate:"uri"validate:"url"
更多功能请参看文档:validator network DOC
Format
base64:字段值是否包含有效的base64值
更多功能请参看文档 validator strings doc
其他
三、安装
go get:
go get github.com/go-playground/validator/v10
在文件中引用validator包:
import "github.com/go-playground/validator/v10"
四、validator使用
例子1:验证单个字段变量值
validation1.go
运行输出:
go run simple1.go
Key: '' Error:Field validation for '' failed on the 'required' tag
Key: '' Error:Field validation for '' failed on the 'required' tag
success
Key: '' Error:Field validation for '' failed on the 'email' tagEnd!!
例子2:验证结构体struct
validation_struct.go,这个程序还列出了效验出错字段的一些信息,
运行 输出:
$ go run validation_struct.go
=== error msg ====
Key: 'User.Age' Error:Field validation for 'Age' failed on the 'lte' tag
Key: 'User.Addresses[0].City' Error:Field validation for 'City' failed on the 'required' tag=========== error field info ====================
Namespace: User.Age
Fild: Age
StructNamespace: User.Age
StructField: Age
Tag: lte
ActualTag: lte
Kind: uint8
Type: uint8
Value: 135
Param: 130Namespace: User.Addresses[0].City
Fild: City
StructNamespace: User.Addresses[0].City
StructField: City
Tag: required
ActualTag: required
Kind: string
Type: string
Value:
Param:
还可以给字段加一些其他tag信息,方面form,json的解析,如下:
用户自定义函数验证
用户自定义函数验证字段是否合法,效验是否正确。
例子3: 通过字段tag自定义函数
validate.RegisterValidation
customer_tag.go:
运行输出:
$ go run customer.go
first value: &{jimmy 86}
Err(s):
Key: 'User.Age' Error:Field validation for 'Age' failed on the 'lte' tag
second value: &{tom 29}
Err(s):
Key: 'User.Name' Error:Field validation for 'Name' failed on the 'CustomerValidation' tag
**注意:
user structvalidatepanic: Undefined validation function ' CustomerValidation' on field 'Name'
例子4:自定义函数-直接注册函数1
不通过字段tag自定义函数,直接注册函数。
RegisterStructValidation
customer1.go
运行输出:
$ go run customer1.go
Key: 'User.FirstName' Error:Field validation for 'FirstName' failed on the 'firstname' tag
Key: 'User.LastName' Error:Field validation for 'LastName' failed on the 'lastname' tag
例子5:自定义函数-直接注册函数2
RegisterCustomTypeFunc
validate.RegisterCustomTypeFunc:验证类型的自定义函数
customer2.go:
运行输出:
$ go run customer.go
Err(s):
Key: 'DbBackedUser.Name' Error:Field validation for 'Name' failed on the 'required' tag
Key: 'DbBackedUser.Age' Error:Field validation for 'Age' failed on the 'required' tag
注意,这个函数:
RegisterCustomTypeFunc,它上面有2行注释:
// RegisterCustomTypeFunc registers a CustomTypeFunc against a number of types
//
// NOTE: this method is not thread-safe it is intended that these all be registered prior to any validation
它是一个验证数据类型自定义函数,NOTE:这个方法不是线程安全的
五、参考
总结
原文链接:https://www.cnblogs.com/jiujuan/p/13823864.html