gin自定义验证器+中文翻译

gin自定义验证器+中文翻译

    • 1、说明
    • 2、global.go
    • 3、validator.go
    • 4、eg:main.go
    • 5、调用接口测试

1、说明

gin官网自定义验证器给的例子相对比较简单,主要是语法级别,便于入门学习,并且没有给出翻译相关的处理,因此在这里记录一下通用一点的自定义验证器+中文翻译的代码,可以直接在往后的go-web项目直接使用

2、global.go

// Package global 当前包存放全局的变量,便于项目所有包使用
package globalimport ("net/http""strings""github.com/gin-gonic/gin"ut "github.com/go-playground/universal-translator""github.com/go-playground/validator/v10"
)/****************************** 全局变量 ****************************/
var (// Trans 全局的翻译器Trans ut.Translator
)/****************************** 辅助函数 ****************************/// removeTopStruct 移除打印的错误信息中的结构体包前缀
func removeTopStruct(fields map[string]string) map[string]string {rsp := map[string]string{}for field, err := range fields {rsp[field[strings.Index(field, ".")+1:]] = err}return rsp
}// HandlerValidatorError 处理校验错误响应
func HandlerValidatorError(c *gin.Context, err error) {errs, ok := err.(validator.ValidationErrors)if !ok {c.JSON(http.StatusOK, gin.H{"msg": err.Error(),})return}c.JSON(http.StatusBadRequest, gin.H{"error": removeTopStruct(errs.Translate(Trans)),})return
}

3、validator.go

package validatorimport ("fmt""reflect""regexp""strings""github.com/gin-gonic/gin/binding""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"
)// 验证器
var (trans ut.Translator
)/****************************** 翻译器、自定义的验证器的初始化 ****************************/// InitChineseTranslator 初始化中文翻译器
func InitChineseTranslator(){if err := initTrans("zh"); err != nil {panic("初始化翻译器错误" + err.Error())} else {fmt.Println("初始化中文翻译器成功")}
}// InitEnglishTranslator 初始化英文翻译器
func InitEnglishTranslator(){if err := initTrans("en"); err != nil {panic("初始化翻译器错误" + err.Error())} else {fmt.Println("初始化英文翻译器成功")}
}// initTrans 初始化翻译器
func initTrans(locale string) (err error) {//修改gin框架中的validator引擎属性, 实现定制if v, ok := binding.Validator.Engine().(*validator.Validate); ok {//注册一个获取json的tag的自定义方法v.RegisterTagNameFunc(func(fld reflect.StructField) string {name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]if name == "-" {return ""}return name})zhT := zh.New() //中文翻译器enT := en.New() //英文翻译器//第一个参数是备用的语言环境,后面的参数是应该支持的语言环境uni := ut.New(enT, zhT, enT)// 根据输入获取传入指定的翻译器trans, ok = uni.GetTranslator(locale)if !ok {return fmt.Errorf("uni.GetTranslator(%s)", locale)}switch locale {case "en":err = entranslations.RegisterDefaultTranslations(v, trans)case "zh":err = zhtranslations.RegisterDefaultTranslations(v, trans)default:err = entranslations.RegisterDefaultTranslations(v, trans)}}return
}// InitValidationRules 注册自定义的验证器
func InitValidationRules() {if v, ok := binding.Validator.Engine().(*validator.Validate); ok {// 1、mobile验证器相关{// 设置自定义验证器的翻译配置,每个验证器搭配一个翻译规则err := v.RegisterTranslation("mobile", trans, func(ut ut.Translator) error {return ut.Add("mobile", "{0} 非法的手机号!", true) // see universal-translator for details}, func(ut ut.Translator, fe validator.FieldError) string {t, _ := ut.T("mobile", fe.Field())return t})// mobile验证器err = v.RegisterValidation("mobile", validateMobile)if err != nil {panic("mobile验证器注册失败:" + err.Error())}}//	2、XXX验证器相关{}fmt.Println("初始化验证器成功")}
}/****************************** 自定义验证器 ****************************/// validateMobile 手机号码的校验规则,用于gin的请求参数自动校验
func validateMobile(fl validator.FieldLevel) bool {// 内部通过反射获取mobile的值mobile := fl.Field().String()//使用正则表达式判断是否合法isValid, _ := regexp.MatchString(`^1([38][0-9]|14[579]|5[^4]|16[6]|7[1-35-8]|9[189])\d{8}$`, mobile)return isValid
}/****************************** 自定义验证器 ****************************/// validateMobile 手机号码的校验规则,用于gin的请求参数自动校验
func validateMobile(fl validator.FieldLevel) bool {// 内部通过反射获取mobile的值mobile := fl.Field().String()//使用正则表达式判断是否合法isValid, _ := regexp.MatchString(`^1([38][0-9]|14[579]|5[^4]|16[6]|7[1-35-8]|9[189])\d{8}$`, mobile)return isValid
}

4、eg:main.go

使用样例,需要在main函数中先调用validator包中的函数,初始化翻译器跟验证器
在接口解析参数的地方,判断处理验证异常

package mainimport ("fmt""net/http""github.com/gin-gonic/gin"// 引入全局的校验异常处理函数"Go_Bible/valiator_test/global"// 引入通用的验证器相关代码"Go_Bible/valiator_test/validator"
)/****************************** 表单结构体、配置校验约束 ****************************/// PasswordLoginForm 用户名、密码登录表单结构体
type PasswordLoginForm struct {Mobile   string `form:"mobile" json:"mobile" binding:"required,mobile"` // 自定义了mobile验证器,使用自定义的校验规则Password string `form:"password" json:"password" binding:"required,min=3,max=10"`
}/****************************** 接口实现 ****************************/// Login 登录接口
func Login(c *gin.Context) {passwordLoginForm := PasswordLoginForm{}// 解析form参数或者json参数if err := c.ShouldBindJSON(&passwordLoginForm); err != nil {// 处理验证异常global.HandlerValidatorError(c, err)return}fmt.Println("参数通过验证,登录接口请求参数:", passwordLoginForm)c.JSON(http.StatusOK, gin.H{"msg": passwordLoginForm,})
}/****************************** 主函数 ****************************/
func main() {// 1、初始化中文翻译器validator.InitChineseTranslator()// 2、初始化自定义的验证器+验证信息翻译validator.InitValidationRules()// 3、初始化gin路由配置router := gin.Default()router.POST("/login", Login)fmt.Println("Gin启动")if err := router.Run(":8081"); err != nil {panic("Gin启动错误:" + err.Error())}
}

5、调用接口测试

启动main.go,发送请求测试接口:http://127.0.0.1:8081/login

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红黑树底层封装map、set C++

目录 一、框架思考 三个问题 问题1的解决 问题2的解决: 问题3的解决: 二、泛型编程 1、仿函数的泛型编程 2、迭代器的泛型编程 3、typename: 4、/--重载 三、原码 红黑树 map set 一、框架思考 map和set都是使用红黑树底层&…

新人学习笔记值(初始JavaScript)

一、Java Script是什么 1.Java Script是世界上最流行的语言之一,是一种运行在客户端的脚本语言(script是脚本的意思) 2.脚本语言:不需要编译,运行过程中由js解释器(js引擎)进行解释并运行 3.现在…

Vue原理学习:vdom 和 diff算法(基于snabbdom)

vdom 和 diff 背景 基于组件化,数据驱动视图。只需关心数据,无需关系 DOM ,好事儿。 但是,JS 运行非常快,DOM 操作却非常慢,如何让“数据驱动视图”能快速响应? 引入 vdom 用 vnode 表示真实…

联合新能源汽车有限公司出席2024年7月8日杭州快递物流展

参展企业介绍 青岛联合新能源汽车有限公司(简称:联合汽车),是一家专注于纯电动汽车领域创新的科技公司,在国内率先提出车电分离,电池标准化并共享的方案,研发了包含标准电池、电池仓、可换电纯电…

Bootstrap Studio for Mac:打造专业级网页设计软件

对于追求高效与品质的设计师和开发者来说,Bootstrap Studio for Mac无疑是最佳选择。它建立在广受欢迎的Bootstrap框架之上,输出干净、语义化的HTML代码。同时,强大的CSS和SASS编辑器,支持自动建议和规则验证,让您的设…

深度学习500问——Chapter08:目标检测(9)

文章目录 8.5 目标检测的技巧汇总 8.5.1 Data Augmentation 8.5.2 OHEM 8.5.3 NMS:Soft NMS/ Polygon NMS/ Inclined NMS/ ConvNMS/ Yes-Net NMS/ Softer NMS 8.5.4 Multi Scale Training/Testing 8.5.5 建立小物体与context的关系 8.5.6 参考relation network 8.5.…

QCustomplot---动态图

QCustomplot绘制动态曲线图-游标及鼠标跟踪显示数值_qcustomplot 游标-CSDN博客 m_timer new QTimer(this);connect(m_timer,SIGNAL(timeout()),this,SLOT(slotTimeout()));m_timer->start(50); void MainWindow::slotTimeout() {static int p0;static int i0;double m,m1…

简单聊聊分布式和集群

前言 分布式和集群,我们都听的比较多,分布式系统和集群的概念对于刚进入职场的小伙伴可能不是很清楚,这篇文章我们就一起看看两者到底是什么,有什么区别。 什么是分布式系统? 先看下书面解释: 分布式系统…

Milvus的系统架构

简介 Milvus的构建在许多知名的向量搜索库比如Faiss, HNSW, DiskANN, SCANN等之上的,它针对稠密向量数据集的相似搜索而设计,能支持百万、十亿甚至万亿级别的向量搜索。 Milvus支持数据分片,流式数据插入,动态schema&#xff0c…

STM32手写寄存器的方式实现点亮LED灯

这次是从头开始学习STM32,看野火的视频开始学习,感觉需要记录的时候就要记录一下学习的心得。野火视频学习的老师讲的还是很到位的,能够学习到很多的细节之处,有时会感觉很啰嗦,但是不得不说确实很详细,只有…

线程池 ThreadPool

一般情况下我们都使用Thread类创建线程,因为通过Thread对象可以对线程进行灵活 的控制。但过多创建线程和销毁线程,会消耗掉大量的内存和CPU资源, 假如某段时间内突然爆发了100个短小的线程,创建和销毁这些线程就会消耗很多时间&a…

SAP_ABAP-思考篇

作为一个SAP十年左右的从业者,其实我很清楚,我自身的能力,确实是很多东西都会一点,但是没有一样是精通的。坦白来说,我的个人简介里,虽然也不算夸大,但我估计有些新手小白看着可能会觉得还挺厉害…

【氮化镓】高电容密度的p-GaN栅电容在高频功率集成中的应用

这篇文章是香港科技大学Kevin J. Chen等人与台积电M.-H. Kwan等人关于高电容密度的p-GaN栅电容在高频功率集成中的应用研究。 文章详细介绍了p-GaN栅电容的设计、特性和在高频功率集成中的应用。通过实验数据和理论分析,文章展示了p-GaN栅电容在实现高电容密度、低…

2.前端路由的配置和使用

一,路由的作用 路由的作用就是将页面文件跟URL地址形成对应匹配 二,如何安装路由 这里我们采用pnpm的方式在项目中执行 pnpm install vue-routernext --save三,路由如何使用 首先创建一个我们需要访问的页面文件,这里我先创建…

二.使用PgAdmin连接Postgresql

二.使用PgAdmin连接Postgresql PostgreSQL是一种开源的对象关系型数据库管理系统(ORDBMS),它支持大部分SQL标准并提供了许多高级功能,例如事务、外键、视图、触发器等。PostgreSQL由PostgreSQL全球开发组维护和开发,它是一种高度可扩展的数据库系统,可以在各种操作系统…

web学习笔记(五十五)

目录 1. 配置代码片段的步骤 2. 条件判断 2.1 v-if、v-else、v-else-if 2.2 v-show 2.3 v-show和v-if的区别 1. 配置代码片段的步骤 在Visual Studio Code中我们可以将常用的代码配置成代码片段,这样就可以在页面上快速输入大段代码了。 (1&#…

22 优化日志文件统计程序-按月份统计每个用户每天的访问次数

读取任务一中序列文件&#xff0c;统计每个用户每天的访问次数&#xff0c;最终将2021/1和2021/2的数据分别输出在两个文件中。 一、创建项目步骤&#xff1a; 1.创建项目 2.修改pom.xml文件 <packaging>jar</packaging> <dependencies><dependency>…

HNU-算法设计与分析-作业1

算法设计与分析 计科210X 甘晴void 202108010XXX 前言 这个系列本来想只用一个博客搞定的&#xff0c;谁曾想CSDN对于大批量文字的在线编辑一塌糊涂&#xff0c;感觉走倒车了。只能分成几个博客分别来讲了。后续会有作业-23456。作业重要的是搞懂原因。 文章目录 算法设计与…

【数据结构】时间、空间复杂度实例分析

跌倒了&#xff0c;就重新站起来&#xff0c;继续向前走&#xff1b;傻坐在地上是没用的。&#x1f493;&#x1f493;&#x1f493; 目录 •✨说在前面 &#x1f34b;知识点一&#xff1a;算法的效率 • &#x1f330;1.斐波那契数列的第n项 • &#x1f330;2.算法的复杂度…

001_PyQt简介

本系列面向零基础小白&#xff0c;从零开始到Pyqt 进行项目实战。 什么叫从零开始&#xff1f;从软件安装、环境配置开始。 不跳过一个细节&#xff0c;不漏掉一行代码&#xff0c;不省略一个例图。 PyQt作为一个强大的工具包&#xff0c;成功地将脚本语言python和QT库融合到…