目录

  • 一、概述
  • 二、使用官方标记符进行数据效验
  • 三、自定义标记符和翻译器进行数据效验

一、概述

在接口开发经常需要进行数据校验,validator包是一个比较强大的校验工具包。下面是一些学习总结,全文使用gin框架进行讲解,详细内容可以查看validator

二、使用官方标记符进行数据效验

下面我以“required”进行代码演示,要查看更多标记符可以查看官方文档

导包

import ("errors""fmt""github.com/gin-gonic/gin""github.com/go-playground/locales/en""github.com/go-playground/locales/zh"ut "github.com/go-playground/universal-translator""github.com/go-playground/validator/v10"enTranslations "github.com/go-playground/validator/v10/translations/en"zhTranslations "github.com/go-playground/validator/v10/translations/zh""net/http""reflect""regexp""strings"
)

定义全局键值对,可以方便取到验证器和翻译器,以及要翻译的语言

const (ValidatorKey  = "ValidatorKey"TranslatorKey = "TranslatorKey"locale = "zh"
)

初始化验证器和翻译器

func TransInit(c *gin.Context)  {//设置支持语言chinese := zh.New()english := en.New()//设置国际化翻译器uni := ut.New(chinese, chinese, english)//设置验证器val := validator.New()//根据参数取翻译器实例trans, _ := uni.GetTranslator(locale)//翻译器注册到validatorswitch locale {case "chinese":zhTranslations.RegisterDefaultTranslations(val, trans)//使用fld.Tag.Get("comment")注册一个获取tag的自定义方法val.RegisterTagNameFunc(func(fld reflect.StructField) string {return fld.Tag.Get("comment")})case "english":enTranslations.RegisterDefaultTranslations(val, trans)val.RegisterTagNameFunc(func(fld reflect.StructField) string {return fld.Tag.Get("en_comment")})}c.Set(TranslatorKey, trans)c.Set(ValidatorKey, val)
}

将路由变量params和gin框架绑定


func DefaultGetValidParams(c *gin.Context, params interface{}) error {c.ShouldBind(params)//获取验证器val, _ := c.Get(ValidatorKey)valid, _ := val.(*validator.Validate)//获取翻译器tran, _ := c.Get(TranslatorKey)trans, _ := tran.(ut.Translator)err := valid.Struct(params)//如果数据效验不通过,则将所有err以切片形式输出if err != nil {errs := err.(validator.ValidationErrors)sliceErrs := []string{}for _, e := range errs {//使用validator.ValidationErrors类型里的Translate方法进行翻译sliceErrs = append(sliceErrs, e.Translate(trans))}return errors.New(strings.Join(sliceErrs, ","))}return nil
}

接下来我们定义一个结构体,对其传参检验输出结果
form是前端传入的参数名;comment是自定义tag,本文表示的是参数报错时显示的名称;validate里传入标记符,这里传入’required’(字段必填)

type login struct {Username string ` form:"username" comment:"用户名" validate:"required"`
}

编写路由函数

func loginTest(c *gin.Context) {TransInit(c)req:=&login{}err:=DefaultGetValidParams(c,req)//失败时输出if err != nil {c.JSON(404, gin.H{"code": 2000,"err":  err.Error(),})return}//成功时输出c.JSON(http.StatusOK, gin.H{"code": 0,"msg":  "success","name":req.Username,})
}

最后运行

func main()  {route := gin.Default()route.POST("/login",loginTest)route.Run(":8099")
}

使用Postman进行测试:

如果没填参数则提示“必填”:

如果把翻译的语言改为英语,效验失败时如下输出:

const (ValidatorKey  = "ValidatorKey"TranslatorKey = "TranslatorKey"//locale = "chinese"locale = "english"
)

三、自定义标记符和翻译器进行数据效验

相比于官方定义好可以直接拿来用的标记符,自定义标记符具有更广泛的应用,我在项目中经常用的也是自定义标记符。同时自定义翻译器也可以更清楚的告诉用户格式输入错误。
首先自定义一个标识符"valid_username"

type login struct {Username string ` form:"username" comment:"用户名" validate:"required,valid_username"`
}

这里我使用了正则进行效验。更多的正则匹配规则可自行百度,这里不作更多介绍
在初始化翻译器中加入如下函数:

//自定义验证方法
val.RegisterValidation("valid_username", func(fl validator.FieldLevel) bool {matched, _ := regexp.Match("^[a-z]{6,30}$", []byte(fl.Field().String()))return matched
})
//自定义翻译器
val.RegisterTranslation("valid_username", trans, func(ut ut.Translator) error {return ut.Add("valid_username", "{0}输入格式不正确或长度不符", true)
},
func(ut ut.Translator, fe validator.FieldError) string {t, _ := ut.T("valid_username", fe.Field())return t
})

即:

func TransInit(c *gin.Context)  {//设置支持语言chinese := zh.New()english := en.New()//设置国际化翻译器uni := ut.New(chinese, chinese, english)//设置验证器val := validator.New()//根据参数取翻译器实例trans, _ := uni.GetTranslator(locale)//翻译器注册到validatorswitch locale {case "chinese":zhTranslations.RegisterDefaultTranslations(val, trans)val.RegisterTagNameFunc(func(fld reflect.StructField) string {return fld.Tag.Get("comment")})//自定义验证方法val.RegisterValidation("valid_username", func(fl validator.FieldLevel) bool {matched, _ := regexp.Match("^[a-z]{6,30}$", []byte(fl.Field().String()))return matched})//自定义翻译器val.RegisterTranslation("valid_username", trans, func(ut ut.Translator) error {return ut.Add("valid_username", "{0}输入格式不正确或长度不符", true)},func(ut ut.Translator, fe validator.FieldError) string {t, _ := ut.T("valid_username", fe.Field())return t})case "english":enTranslations.RegisterDefaultTranslations(val, trans)//使用fld.Tag.Get("en_comment")注册一个获取tag的自定义方法val.RegisterTagNameFunc(func(fld reflect.StructField) string {return fld.Tag.Get("en_comment")})}c.Set(TranslatorKey, trans)c.Set(ValidatorKey, val)
}

重新运行查看结果

golang中使用validator进行数据校验及自定义翻译器相关推荐

  1. 在Python中使用CRC进行数据校验

    原文出处: https://xugaoxiang.com/2019/12/08/python-crc/ 软硬件环境 ubuntu 18.04 64bit anaconda with python 3. ...

  2. springboot项目拦截器中获取接口返回数据_Spring Boot自定义Annotation实现接口自动幂...

    在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的影响相同.按照这个含义,最终的含义就是 对数据库的影响只能是一次性的,不能重 ...

  3. c语言实现java接口_五分钟带你了解Java是如何从容而优雅地实现接口数据校验

    本篇文章给大家分享平时开发中总结的一点小技巧!在工作中写过Java程序的朋友都知道,目前使用Java开发服务最主流的方式就是通过Spring MVC定义一个Controller层接口,并将接口请求或返 ...

  4. java接口如何接受语音参数_Java 是如何优雅地实现接口数据校验的?

    作者 | 无敌码农  责编 | 张文头图 | CSDN 下载自东方 IC来源 | 无敌码农(ID:jiangqiaodege)本篇文章给大家分享平时开发中总结的一点小技巧!在工作中写过 Java 程序 ...

  5. Java 是如何优雅地实现接口数据校验的?

    作者 | 无敌码农  责编 | 张文 头图 | CSDN 下载自东方 IC 来源 | 无敌码农(ID:jiangqiaodege) 本篇文章给大家分享平时开发中总结的一点小技巧! 在工作中写过 Jav ...

  6. SpringMVC数据校验、文件上传

    SpringMVC数据校验.文件上传 首先在此鸣谢所有本篇博客涉及技术给予我指导的导师,朋友! 目录: 1.文件上传流程: 2.数据校验: 3.本试验遇到的报错问题及解决办法: 4.Java文件源代码 ...

  7. SpringBoot——服务端数据校验

    Spring Validator和Hibernate Validator是两套Validator,可以混着用,这里我们用Hibernate Validator 一.添加依赖: 添加依赖的时候注意不要添 ...

  8. Spring MVC(4):数据校验

    Spring MVC数据校验 一般来说,准许开发中的 DRY 原则,对于Java程序中的数据校验逻辑和相应的域模型会进行绑定,将代码逻辑集中管理: Spring 在使用DataBinder 对数据进行 ...

  9. Java17 POI5.2.0 Excel 下拉框 数据校验

    Java 设置Excel 下拉框.自定义数据校验 一.工具类 1.ExcelUtil 2.Pom 二.生成文件 1.下拉框 2.数据校验 三.Excel 命令 1.获取活动单元格:=INDIRECT( ...

最新文章

  1. MyEclipse报错:String cannot be resolved to a type
  2. mysql for update_mysql SELECT FOR UPDATE语句使用示例
  3. Mac OS X 下 TAR.GZ 方式安装 MySQL5.6
  4. 816D.Karen and Test 杨辉三角 规律 组合
  5. xshell免费版下载安装及使用
  6. [Mac]如何卸载McAfee
  7. 你还在纠结英语的发音问题吗,你还老记不住单词吗?
  8. 【1stopt】批处理拟合
  9. 最直白的编译原理-基础知识(清华-王书3版)
  10. 记一次HDD(机械硬盘)突然出故障,然后数据恢复以及更换HDD的过程
  11. 租用GPU服务器跑深度学习模型心得
  12. android安卓手机分屏多窗口实现方法
  13. Python爬虫-02 request模块爬取妹子图网站
  14. MySQL常用命令与函数
  15. 安装python+selenium
  16. 计算机无法登录到网络,电脑无法连接到这个网络是什么原因
  17. 实时时钟DS1302-第1季第14部分-朱有鹏-专题视频课程
  18. 牛客 游戏(概率DP)
  19. UI组件Kendo UI for jQuery数据管理入门指南 - TaskBoard/卡片
  20. 50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 下

热门文章

  1. php升序排列,php关联数组怎么按键名实现升序排列
  2. 树莓派开机自启动opencv程序脚本及报错分析及拓展
  3. 又是一年叶落时(二)
  4. WSA(win11子系统)安卓应用抢先体验
  5. SAP WRITE设置列表颜色 页眉页尾输出控制
  6. gps测距+java_GPS测距会高估你的移动距离
  7. 【C语言】一文彻底理解指针,通俗易懂
  8. 迷宫(二) 计蒜客--1596
  9. 我的世界红石计算机教程1,《我的世界》红石电脑制作原理及使用教程
  10. Excel常见技巧GIF示例