【GoLang】利用validator包实现服务端参数校验时自定义错误信息

在C/S架构下,服务端在校验请求参数时,若出现参数错误,要响应给客户端一个错误消息,通常我们会统一响应“参数错误”。在这里插入图片描述
在这里插入图片描述
但是,如果只是一味的提示参数错误,我并不知道具体是哪个参数错了呀!能不能有更详细,更细致的提示信息?例如(账号错误、密码为空、姓名不能包含数字),当然可以,下面我来教你如何利用validator包实现自定义参数错误信息。

validator包下载

validator是开源的第三方包,专门用于进行参数校验。我们先下载一下:

github.com/go-playground/validator/v10

打上结构体标签

validator包提供了结构体标签选项,我们可以为想要进行参数校验的字段打上标签,之后就会以此标签作为校验标准
在这里插入图片描述

进行参数校验

Struct方法会检验其参数s(假设参数s为结构体)是否符合结构体标签的标准(上文提到的validate标签)。若不符合标准,则将具体不符合的情况作为err返回。
在这里插入图片描述

现在我们模拟一遍请求参数错误时的场景

package mainimport ("fmt""github.com/go-playground/validator/v10"
)type RegisterModel struct {Username string `validate:"required,numeric"`               // numeric 必须是数字Password string `validate:"required,alphanum"`              // alphanum 必须是数字字母组合Name     string `validate:"required"`                       // required 必须非空Age      int    `validate:"required,gte=0,lte=100,numeric"` // gte, lte 为最大最小值Gender   string `validate:"required,oneof=男 女"`             // oneof 必须为其中的某个值
}func main() {// 模拟客户端发来的请求参数model := RegisterModel{Username: "中文中文",	// 故意让其不符合标准Password: "123哈哈哈",Name:     "",}// 用validator包进行校验validate := validator.New()	// 先new一个对象err := validate.Struct(model)	// 通过对象调用Struct方法if err != nil {fmt.Println(err)}
}

打印错误信息,可以发现其中包含了 不符合标准的字段 和 不符合标准的标签(下文将其统称为错误字段、错误标签)在这里插入图片描述

有了这些信息,就方便我们进行自定义参数信息了!但是仅有这些还不够,我们需要将这些信息各自提取到变量中。

将错误字段和错误标签提取出来

validator包里也给我们提供了方法:我们先将得到的err断言成validator.ValidationErrors,其本质是一个结构体切片,结构体中包含了错误字段和错误标签。接着我们遍历该结构体,即可拿到错误字段和错误标签。

		// 将err中包含的字段和标签提取出来if validationErrors, ok := err.(validator.ValidationErrors); ok {	// 将err断言for _, vErr := range validationErrors { // validationErrors 是一个结构体切片fmt.Println(vErr.StructField(), vErr.Tag())	// 打印得到的错误字段和错误标签}}

在这里插入图片描述

实战如下

package mainimport ("fmt""github.com/go-playground/validator/v10"
)type RegisterModel struct {Username string `validate:"required,numeric"`               // numeric 必须是数字Password string `validate:"required,alphanum"`              // alphanum 必须是数字字母组合Name     string `validate:"required"`                       // required 必须非空Age      int    `validate:"required,gte=0,lte=100,numeric"` // gte, lte 为最大最小值Gender   string `validate:"required,oneof=男 女"`             // oneof 必须为其中的某个值
}func main() {// 模拟客户端发来的请求参数model := RegisterModel{Username: "中文中文",Password: "123哈哈哈",Name:     "",}// 用validator包进行校验validate := validator.New()err := validate.Struct(model)if err != nil {fmt.Println(err)// 将err中包含的字段和标签提取出来if validationErrors, ok := err.(validator.ValidationErrors); ok {for _, vErr := range validationErrors { // validationErrors 是一个结构体切片vErr.StructField()vErr.Tag()fmt.Println(vErr.StructField(), vErr.Tag())}}}
}

在这里插入图片描述

现在我们有了错误字段和错误标签,我们就可以自定义参数错误信息了。

自定义参数错误信息

这里我用的方法是我自创的,比较土,主要是在map中通过错误字段、错误标签映射到自定义的信息。
首先声明两个map
声明的2个map
然后在遍历中通过map的映射关系获取到自定义信息。
在这里插入图片描述
实战:

package mainimport ("fmt""github.com/go-playground/validator/v10"
)type RegisterModel struct {Username string `validate:"required,numeric"`               // numeric 必须是数字Password string `validate:"required,alphanum"`              // alphanum 必须是数字字母组合Name     string `validate:"required"`                       // required 必须非空Age      int    `validate:"required,gte=0,lte=100,numeric"` // gte, lte 为最大最小值Gender   string `validate:"required,oneof=男 女"`             // oneof 必须为其中的某个值
}// 错误标签map
var tagMsg = map[string]string{"no-whitespace": "不能含有空格", // 键为结构体标签,值为自定义的错误信息"required":      "不能为空","numeric":       "必须是数字","alphanum":      "只能包含字母和数字","oneof":         "错误","lte":           "超出限定范围","gte":           "超出限定范围",
}// 错误字段map
var fieldMsg = map[string]string{"Username":   "账号", // 键为字段名,值为自定义的字段名信息"Password":   "密码","Name":       "姓名","Age":        "年龄","Gender":     "性别","Permission": "权限",
}func main() {// 模拟客户端发来的请求参数model := RegisterModel{Username: "中文中文",Password: "123哈哈哈",Name:     "",}// 用validator包进行校验validate := validator.New()err := validate.Struct(model)if err != nil {fmt.Println(err)// 将err中包含的字段和标签提取出来if validationErrors, ok := err.(validator.ValidationErrors); ok {for _, vErr := range validationErrors { // validationErrors 是一个结构体切片fmt.Println(fieldMsg[vErr.StructField()] + tagMsg[vErr.Tag()])}}}
}

输出结果:在这里插入图片描述

至此,我们就用validator包实现自定义参数错误信息。
感谢浏览,如有不对欢迎指出。

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

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

相关文章

Web 代理、爬行器和爬虫

目录 Web 在线网页代理服务器的使用方法Web 在线网页代理服务器使用流程详解注意事项 Web 请求和响应中的代理方式Web 开发中的请求方法借助代理进行文件下载的示例 Web 服务器请求代理方式代理、网关和隧道的概念参考文献说明 爬虫的工作原理及案例网络爬虫概述爬虫工作原理 W…

《智人之上:从石器时代到 AI 时代的信息网络简史》介绍

《智人之上:从石器时代到AI时代的信息网络简史》是尤瓦尔赫拉利于2024年推出的新作,以下是关于这本书的详细介绍: ### 作者简介 尤瓦尔赫拉利,1976年出生于以色列海法,成长于世俗犹太家庭。他3岁自学读书,…

在无法联网的Linux主机或者容器内远程连接主机部署或者容器版的postgresql数据库

最近做的项目遇到一个问题,需要在Linux主机或者容器内(内网环境,无法联网下载postgresql资源),访问远程环境上主机或者容器部署的postgresql数据库,进行数据库数据备份和恢复。 我们知道,直接在…

C语言内存管理详解

C语言不像其他高级语言那样提供自动内存管理,它要求程序员手动进行内存的分配和释放。在C语言中,动态内存的管理主要依赖于 malloc、calloc、realloc 和 free 等函数。理解这些函数的用法、内存泄漏的原因及其防止方法,对于编写高效、可靠的C…

论文阅读的附录(七):Understanding Diffusion Models: A Unified Perspective(二):公式46的推导

Understanding Diffusion Models: A Unified Perspective(二):公式46的推导 文章概括要推导的公式1. 条件概率的定义2. 联合分布的分解2.1 联合分布的定义2.2 为什么可以这样分解?2.3 具体意义 3. 分母的分解:边际化规…

Airflow:解码Airflow执行日期

执行日期是Apache Airflow(用于编排复杂数据管道的开源平台)的关键概念。掌握执行日期的概念及其对工作流的影响对于构建高效、可靠和可维护的数据管道至关重要。在本实用指南中,我们将深入研究执行日期在气流中的作用,它们的目的…

探究 Facebook 隐私安全发展方向,未来走向何方?

随着社交媒体的普及,隐私和数据安全问题成为了全球关注的焦点。Facebook,作为全球最大的社交平台之一,其隐私安全问题尤其引人注目。近年来,随着用户数据泄露事件的不断发生,Facebook 不断调整其隐私政策,探…

ray.rllib 入门实践-2:配置算法

前言: ray.rllib的算法配置方式有多种,网上的不同教程各不相同,有的互不兼容,本文汇总罗列了多种算法配置方式,给出推荐,并在最后给出可运行代码。 四种配置方式 方法1 import os from ray.rllib.algori…

Kaggle入门

title: Kaggle入门 tags: Kaggle abbrlink: 26966 date: 2023-08-19 22:23:36 Kaggle 入门 什么是 Kaggle? Kaggle是一个进行数据挖掘和预测竞赛的在线平台。 从公司的角度,可以提供一些数据,进而提出一个实际需要解决的问题。 从参赛者…

css-设置元素的溢出行为为可见overflow: visible;

1.前言 overflow 属性用于设置当元素的内容溢出其框时如何处理。 2. overflow overflow 属性的一些常见值: 1 visible:默认值。内容不会被剪裁,会溢出元素的框。 2 hidden:内容会被剪裁,不会显示溢出的部分。 3 sc…

状态模式——C++实现

目录 1. 状态模式简介 2. 代码示例 3. 单例状态对象 4. 状态模式与策略模式的辨析 1. 状态模式简介 状态模式是一种行为型模式。 状态模式的定义:状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 通俗的说就是一个对象…

Word 中实现方框内点击自动打 √ ☑

注: 本文为 “Word 中方框内点击打 √ ☑ / 打 ☒” 相关文章合辑。 对第一篇增加了打叉部分,第二篇为第一篇中方法 5 “控件” 实现的详解。 在 Word 方框内打 √ 的 6 种技巧 2020-03-09 12:38 使用 Word 制作一些调查表、检查表等,通常…

利用 Three.js 实现 3D 粒子正方体效果

在这篇文章中,我将向大家展示如何使用 Three.js 创建一个带有粒子的 3D 正方体效果。通过这段代码,我们将能够在浏览器中渲染一个 3D 正方体形状,并且该正方体内部填充了大量粒子(可视化效果)。你可以通过鼠标控制视角…

DRF开发避坑指南01

在当今快速发展的Web开发领域,Django REST Framework(DRF)以其强大的功能和灵活性成为了众多开发者的首选。然而,错误的使用方法不仅会导致项目进度延误,还可能影响性能和安全性。本文将从我个人本身遇到的相关坑来给大…

ES设置证书和创建用户,kibana连接es

1、启动好es 2、进入es容器 docker exec -it es /bin/bash 3、生成ca证书 ./bin/elasticsearch-certutil ca 注:两个红方框位置直接回车 4、生成cert证书 ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 注:前两个红框直接回车&am…

一位前端小白的2024总结

目录 简要 一、迷茫点的解决 (1)前端领域该怎么学? (2)旧技术还需要学吗? (3)我该学些什么? 二、折磨点的解决 (1)学技术成果回报太慢怎么…

数据分析学习路线

阶段 1:数学与统计基础 1.1 数学基础 数据分析涉及大量的数学知识,尤其是统计学。虽然你不需要成为数学专家,但一些基本的数学概念对你理解数据分析非常重要。 线性代数: 矩阵运算:理解矩阵乘法、求逆等操作。特征值…

python爬虫 爬取站长素材 (图片)(自学6)

安装 :lxml 地址 : Installing lxml pip install lxml 或者 sudo pip install lxml 下面开始 写代码 下载 站长素材的图片 import urllib.requestfrom lxml import etreeimport osdef create_request(page):if(page 1):url "https://sc.chinaz.…

《OpenCV》——图像透视转换

图像透视转换简介 在 OpenCV 里,图像透视转换属于重要的几何变换,也被叫做投影变换。下面从原理、实现步骤、相关函数和应用场景几个方面为你详细介绍。 原理 实现步骤 选取对应点:要在源图像和目标图像上分别找出至少四个对应的点。这些对…

spring---@Pointcut表达式

spring语法 execution 方法表达式:execution(modifiers-pattern? ret-type-pattern declaring-type-pattern/name-pattern(param-pattern) throws-pattern?) 修饰符匹配(modifier-pattern?):可以省略。代表匹配任意修饰符方法;或者显示…