添加验证器(验证器应用)

湘潭网餐饮知识
538

湘潭网小编为大家带来以下内容:

本文小编为大家详细介绍“Golang验证器之validator怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang验证器之validator怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是validator

Validator 是一个 Golang 的第三方库,用于对数据进行校验,常用于 API 的开发中,对客户端发出的请求数据进行严格校验,防止恶意请求。

安装

validator包安装:

go get -u github.com/go-playground/validator/v10使用方法

导入validator:

import "github.com/go-playground/validator/v10"

validator 应用了 Golang 的 Struct Tag 和 Reflect机制,基本思想是:在 Struct Tag 中为不同的字段定义各自类型的约束,然后通过 Reflect 获取这些约束的类型信息并在校验器中进行数据校验。

示例:

package mainimport ("fmt""github.com/go-playground/validator/v10")type User struct {UserName string `json:"user_name" validate:"required"`Password string `json:"password" validate:"required,min=6,max=20"`}func main() {example := User{Password: "123",} //实例化验证器validate  := validator.New() errs := validate.Struct(example)if errs != nil {for _, err := range errs.(validator.ValidationErrors) {fmt.Println(err)}}}

validator包的验证提示默认是英文的,输出如下:

这样看可能不太清楚,如果需要翻译成中文则还需安装验证提示翻译包:

go get -u github.com/go-playground/localesgo get -u github.com/go-playground/universal-translator

修改后如下:

package mainimport ("fmt""github.com/go-playground/locales/zh"ut "github.com/go-playground/universal-translator""github.com/go-playground/validator/v10"zh_translations "github.com/go-playground/validator/v10/translations/zh")type User struct {UserName string `json:"user_name" validate:"required"`Password string `json:"password" validate:"required,min=6,max=20"`}func main() {example := User{Password: "123",}// 中文翻译器uni := ut.New(zh.New())trans, _ := uni.GetTranslator("zh")//实例化验证器validate  := validator.New()// 注册翻译器到校验器err := zh_translations.RegisterDefaultTranslations(validate, trans)if err!=nil {fmt.Println(err)return}errs := validate.Struct(example)if errs != nil {for _, err := range errs.(validator.ValidationErrors) {fmt.Println(err.Translate(trans))}}}

执行输出:

校验规则

下面列举一部分我们开发中经常用到的验证规则

Tag说明示例required必填Field或Struct validate:"required"omitempty空时忽略Field或Struct validate:"omitempty"len长度Field validate:"len=0"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"min最小值Field validate:"min=1"max最大值Field validate:"max=2"required_with其他字段其中一个不为空且当前字段不为空Field validate:"required_with=Field1 Field2"required_without其他字段其中一个为空且当前字段不为空Field `validate:“required_without=Field1 Field2”lowercase符串值是否只包含小写字符Field validate:"lowercase"uppercase符串值是否只包含大写字符Field validate:"uppercase"email字符串值包含一个有效的电子邮件Field validate:"email"json字符串值是否为有效的JSonField validate:"json"url符串值是否包含有效的urlField validate:"url"uri符串值是否包含有效的 uriField validate:"uri"contains字符串值包含子字符串值Field validate:"contains=@"excludes字符串值不包含子字符串值字符串值不包含子字符串值 Field validate:"excludes=@"ip字符串值是否包含有效的 IP 地址Field validate:"ip"datetime字符串值是否包含有效的日期Field validate:"datetime"startswith字符串以提供的字符串值开始Field validate:"startswith=abc"endswith字符串以提供的字符串值结束Field validate:"endswith=abc"跨字段验证

validator 允许定义跨字段验证,即:验证某个字段与其他字段之间的关系。这种验证实际上分为两种:

一种是参数字段就是同一个结构体中的平级字段。

另一种是参数字段为结构中其他字段的字段。

验证语法很简单,如果是验证同一个结构中的字段,则在基础的 Tags 后面添加一个 field 后缀,例如:eqfield 定义字段间的相等(eq)约束。如果是更深层次的字段,在 field 之前还需要加上 cs(Cross-Struct),eq 就变为了 eqcsfield。

eqfield=Field:必须等于 Field 的值。

nefield=Field:必须不等于 Field 的值。

gtfield=Field:必须大于 Field 的值。

gtefield=Field: 必须大于等于 Field 的值。

ltfield=Field:必须小于 Field 的值。

ltefield=Field:必须小于等于 Field 的值。

eqcsfield=Other.Field:必须等于 struct Other 中 Field 的值。

necsfield=Other.Field:必须不等于 struct Other 中 Field 的值。

gtcsfield=Other.Field:必须大于 struct Other 中 Field 的值;

gtecsfield=Other.Field:必须大于等于 struct Other 中 Field 的值。

ltcsfield=Other.Field:必须小于 struct Other 中 Field 的值。

ltecsfield=Other.Field:必须小于等于 struct Other 中 Field 的值。

另外还有几个常用的 Tag:

required_with=Field1 Field2:在 Field1 或者 Field2 存在时,必须;

required_with_all=Field1 Field2:在 Field1 与 Field2 都存在时,必须;

required_without=Field1 Field2:在 Field1 或者 Field2 不存在时,必须;

required_without_all=Field1 Field2:在 Field1 与 Field2 都存在时,必须;

错误处理

通过看源码,我们可以看到validator 返回的错误有两种,一种是参数错误,一种是校验错误,它们都实现了 error 接口。

参数错误时,返回 InvalidValidationError 类型;

校验错误时,返回 ValidationErrors 类型。ValidationErrors 是一个错误切片,保存了每个字段违反的每个约束信息。

所以 validator 校验返回的结果有 3 种情况:

nil:没有错误;

InvalidValidationError:输入参数错误;

ValidationErrors:字段违反约束。

validator 返回的错误有两种,一种是参数错误,一种是校验错误,它们都实现了 error 接口。

参数错误时,返回 InvalidValidationError 类型;

校验错误时,返回 ValidationErrors 类型。ValidationErrors 是一个错误切片,保存了每个字段违反的每个约束信息。

所以 validator 校验返回的结果只有 3 种情况:

nil:没有错误;

InvalidValidationError:输入参数错误;

ValidationErrors:字段违反约束。

我们可以在程序中判断 err != nil 时,可以依次将 err转换为 InvalidValidationError 和 ValidationErrors 以获取更详细的信息:

err := validate.Struct(user)if err != nil {    invalid, ok := err.(*validator.InvalidValidationError)      if ok {        fmt.Println("param error:", invalid)        return    }        validationErrs := err.(validator.ValidationErrors)    for _, validationErr := range validationErrs {        fmt.Println(validationErr)    }}

读到这里,这篇“Golang验证器之validator怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注花开半夏行业资讯频道。

君子莲(www.junzilian.com)湖南省长沙、株洲、湘潭城市宣传信息网,提供房产,人才招聘,家居装饰,教育,论坛,旅游,特产,美食,天气,娱乐,企业等资讯。



最新餐饮知识

热门推荐

为你推荐