Gin框架使用validator进行数据校验及自定义翻译器

编程入门 行业动态 更新时间:2024-10-09 14:19:58

Gin框架使用validator进行数据校验及自定义<a href=https://www.elefans.com/category/jswz/34/1767214.html style=翻译器"/>

Gin框架使用validator进行数据校验及自定义翻译器

Gin框架使用validator进行数据校验及自定义翻译器

安装:go get github/go-playground/validator/v10

一、概述

validator包一个比较强大的校验工具包。下面是一些学习总结,详细内容可以查看validator 。

二、操作符说明

标记标记说明
,多操作符分割
|或操作
-跳过字段验证

三、常用标记说明

标记标记说明
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"
eqfield同一结构体字段相等Field validate:"eqfield=Field2"
nefield同一结构体字段不相等Field validate:"nefield=Field2"
gtfield大于同一结构体字段Field validate:"gtfield=Field2"
gtefield大于等于同一结构体字段Field validate:"gtefield=Field2"
ltfield小于同一结构体字段Field validate:"ltfield=Field2"
ltefield小于等于同一结构体字段Field validate:"ltefield=Field2"
eqcsfield跨不同结构体字段相等Struct1.Field validate:"eqcsfield=Struct2.Field2"
necsfield跨不同结构体字段不相等Struct1.Field validate:"necsfield=Struct2.Field2"
gtcsfield大于跨不同结构体字段Struct1.Field validate:"gtcsfield=Struct2.Field2"
gtecsfield大于等于跨不同结构体字段Struct1.Field validate:"gtecsfield=Struct2.Field2"
ltcsfield小于跨不同结构体字段Struct1.Field validate:"ltcsfield=Struct2.Field2"
ltecsfield小于等于跨不同结构体字段Struct1.Field validate:"ltecsfield=Struct2.Field2"
min最大值Field validate:"min=1"
max最小值Field validate:"max=2"
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\
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"
isdefault是默认值Field validate:"isdefault=0"
oneof其中之一Field validate:"oneof=5 7 9"
containsfield字段包含另一个字段Field validate:"containsfield=Field2"
excludesfield字段不包含另一个字段Field validate:"excludesfield=Field2"
unique是否唯一,通常用于切片或结构体Field validate:"unique"
alphanum字符串值是否只包含 ASCII 字母数字字符Field validate:"alphanum"
alphaunicode字符串值是否只包含 unicode 字符Field validate:"alphaunicode"
alphanumunicode字符串值是否只包含 unicode 字母数字字符Field validate:"alphanumunicode"
numeric字符串值是否包含基本的数值Field validate:"numeric"
hexadecimal字符串值是否包含有效的十六进制Field validate:"hexadecimal"
hexcolor字符串值是否包含有效的十六进制颜色Field validate:"hexcolor"
lowercase符串值是否只包含小写字符Field validate:"lowercase"
uppercase符串值是否只包含大写字符Field validate:"uppercase"
email字符串值包含一个有效的电子邮件Field validate:"email"
json字符串值是否为有效的 JSONField validate:"json"
file符串值是否包含有效的文件路径,以及该文件是否存在于计算机上Field validate:"file"
url符串值是否包含有效的 urlField validate:"url"
uri符串值是否包含有效的 uriField validate:"uri"
base64字符串值是否包含有效的 base64值Field validate:"base64"
contains字符串值包含子字符串值Field validate:"contains=@"
containsany字符串值包含子字符串值中的任何字符Field validate:"containsany=abc"
containsrune字符串值包含提供的特殊符号值Field validate:"containsrune=☢"
excludes字符串值不包含子字符串值Field validate:"excludes=@"
excludesall字符串值不包含任何子字符串值Field validate:"excludesall=abc"
excludesrune字符串值不包含提供的特殊符号值Field validate:"containsrune=☢"
startswith字符串以提供的字符串值开始Field validate:"startswith=abc"
endswith字符串以提供的字符串值结束Field validate:"endswith=abc"
ip字符串值是否包含有效的 IP 地址Field validate:"ip"
ipv4字符串值是否包含有效的 ipv4地址Field validate:"ipv4"
datetime字符串值是否包含有效的 日期Field validate:"datetime"

四、标记使用注意

1、当搜索条件与特殊标记冲突时,如:逗号(,),或操作(|),中横线(-)等则需要使用 UTF-8十六进制表示形式

例:

type Test struct {  Field1 string  `validate:"excludesall=|"`    // 错误  Field2 string `validate:"excludesall=0x7C"` // 正确.  
}  

2、可通过validationErrors := errs.(validator.ValidationErrors)获取错误对象自定义返回响应错误

3、自定义校验结果翻译

五、gin框架中使用验证翻译器

package mainimport ("fmt""github/gin-gonic/gin""github/gin-gonic/gin/binding""github/go-playground/locales/en""github/go-playground/locales/zh"ut "github/go-playground/universal-translator""github/go-playground/validator/v10"enTranslations "github/go-playground/validator/v10/translations/en"zhTranslations "github/go-playground/validator/v10/translations/zh""log""net/http""reflect""strings"
)var trans ut.Translatorfunc main() {r := gin.Default()err := InitTrans("en")if err != nil {log.Fatalln(err)return}r.POST("/test", test())r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
func test() gin.HandlerFunc {return func(ctx *gin.Context) {s := new(struct {Name string `json:"name" binding:"required"`Age  int    `json:"age" binding:"required"`})err := ctx.ShouldBindJSON(s)if err != nil {if errors, ok := err.(validator.ValidationErrors); ok {ctx.JSON(http.StatusOK, ParamError(errors))return}}}
}func InitTrans(locale string) (err error) {if validate, ok := binding.Validator.Engine().(*validator.Validate); ok {validate.RegisterTagNameFunc(func(field reflect.StructField) string {name := strings.SplitN(field.Tag.Get("json"), ",", 2)[0]if name == "-" {return ""}return name})zhT := zh.New()enT := en.New()uniT := ut.New(zhT, enT)// 也可以使用 uni.FindTranslator(...) 传入多个locale进行查找trans, ok = uniT.GetTranslator(locale)if !ok {return fmt.Errorf("uni.GetTranslator(%s) failed", locale)}// 注册翻译器switch locale {case "en":err = enTranslations.RegisterDefaultTranslations(validate, trans)case "zh":err = zhTranslations.RegisterDefaultTranslations(validate, trans)default:err = enTranslations.RegisterDefaultTranslations(validate, trans)}return}return
}func ParamError(err validator.ValidationErrors) *gin.H {return &gin.H{"errCode": -1,"errMsg":  err.Translate(trans),}
}

更多推荐

Gin框架使用validator进行数据校验及自定义翻译器

本文发布于:2024-02-13 18:43:04,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1759454.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:翻译器   自定义   框架   数据   Gin

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!