【GIN】go-gin 中 validator 验证功能

文章目录

  • 前言
  • 一、基础用法
  • 二、常用字段说明
    • 常用字段说明
      • 1. `required`
      • 2. `len`
      • 3. `min` 和 `max`
      • 4. `gte` 和 `lte` 、 `gt` 和 `lt` 、`ne`
      • 5. `oneof`
      • 6. `email`
      • 7. `url`
  • 三、示例代码
    • 运行效果
  • 总结


前言

在 Go 中使用 Gin 框架时,BindJSON 可以将 JSON 请求体中的数据绑定到结构体上,配合 binding 标签还可以进行验证。其主要是通过validator库实现
在Gin的bind/json.go文件中可以看到

validator方法是https://github.com/go-playground/validator/tree/v10.6.1包中的。

所以实际上,gin中binding 验证的方法是使用validator实现的

这样可以快速的实现多种验证条件,而不需要额外的去写验证方法。
Gin 支持多种验证规则,可以通过 binding 标签在结构体字段上定义。下面我们来看一下有哪些验证方法吧。


一、基础用法

假设我们有一个 User 结构体来接收 JSON 数据:
request.go

type User struct {ID        string `json:"id" binding:"required"`          // 必须字段Age       int    `json:"age" binding:"gte=0,lte=130"`    // 年龄范围Email     string `json:"email" binding:"required,email"` // 必须是合法的电子邮件地址Password  string `json:"password" binding:"min=8"`       // 密码至少8字符
}

controller.go

req := &User{}
if err := c.BindJson(req); err != nil {fmt.Println(err)return
}

BindJson中,如果验证有问题则会报出err错误,并显示详细的错误原因。

二、常用字段说明

常用字段说明

1. required

  • 用法binding:"required"
  • 说明:字段必须存在,不能为空。
  • 示例
    Name string `json:"name" binding:"required"`
    

2. len

  • 用法binding:"len=xx"
  • 说明:验证字符串、数组或切片的长度是否等于指定长度。
  • 示例
    Code string `json:"code" binding:"len=6"` // 长度必须为 6
    

3. minmax

  • 用法binding:"min=xx"binding:"max=xx"
  • 说明:适用于数字和字符串;对于数字,限制最小或最大值;对于字符串,限制最小或最大字符数。
  • 示例
    Age int `json:"age" binding:"min=1,max=100"`
    

4. gteltegtltne

  • 用法binding:"gte=xx"binding:"lte=xx"
  • 说明gte 表示“greater than or equal”(大于等于),lte 表示“小于等于”。ne 表示不等于。常用于数字和时间。
  • 示例
    Age int `json:"age" binding:"gte=18,lte=65"`
    

5. oneof

  • 用法binding:"oneof=xx xx xx"
  • 说明:验证字段值必须是列表中的一个,常用于枚举值。
  • 示例
    Status int `json:"status" binding:"oneof=0 1 2"`
    

6. email

  • 用法binding:"email"
  • 说明:验证字段是否是有效的电子邮件格式。
  • 示例
    Email string `json:"email" binding:"required,email"`
    

7. url

  • 用法binding:"url"
  • 说明:验证字段是否为有效的 URL。
  • 示例
    Website string `json:"website" binding:"url"`
    

三、示例代码

使用 BindJSON 并配合 binding 标签验证请求体数据的完整示例:

package mainimport ("github.com/gin-gonic/gin""net/http"
)type User struct {ID       string `json:"id" binding:"required"`Age      int    `json:"age" binding:"gte=0,lte=130"`Email    string `json:"email" binding:"required,email"`Password string `json:"password" binding:"min=8"`
}func main() {router := gin.Default()router.POST("/user", func(c *gin.Context) {var user Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}// Process user datac.JSON(http.StatusOK, gin.H{"status": "User validated and processed"})})router.Run(":8080")
}

运行效果

当发送带有错误字段的 JSON 请求时,会自动返回相应的错误信息,例如:

{"error": "Key: 'User.Email' Error:Field validation for 'Email' failed on the 'email' tag"
}

总结

  1. 使用 binding 标签定义验证规则,简洁且自动验证请求数据。
  2. ShouldBindJSON/BindJSON 可将错误自动绑定到结构体。
  3. 若请求字段验证失败,Gin 会返回详细的错误消息。

本文是经过个人查阅相关资料后理解的提炼,可能存在理论上理解偏差的问题,如果您在阅读过程中发现任何问题或有任何疑问,请不吝指出,我将非常感激并乐意与您讨论。谢谢您的阅读!

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

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

相关文章

[ 问题解决篇 ] win11中本地组策略编辑器gpedit.msc打不开(gpedit.msc缺失)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

RSTP的工作过程

RSTP简介: 生成树协议(STP)用于在网络中防止环路产生,但 STP 的收敛速度较慢。 RSTP(Rapid Spanning Tree Protocol )快速生成树协议:RSTP 是对 STP 的改进,它能在网络拓扑发生变化…

HTML 结构化标签完全指南:<html>、<head>、<body> 和布局标签 <div>、<span> 的功能及其在网页中的应用

文章目录 1. <html> 标签2. <head> 标签3. <body> 标签4. <div> 标签5. <span> 标签小结 在 HTML 文档中&#xff0c;使用特定的结构标签可以有效地组织和管理网页内容。这些标签不仅有助于浏览器正确解析和渲染页面&#xff0c;还能提高网页的可…

php把十六进制转化成字符串 和 字符串转十六进制

最近项目中碰到需要把接收十六进制的数据&#xff0c;十六进制的数据不便阅读 方法一&#xff0c;只是不同的函数 // 十六进制转字符串 function hexToStr($hex) {$hex str_replace( , , $hex); // 去除空格$string ;for ($i 0; $i < strlen($hex) - 1; $i 2) {$st…

异步编程的利之Future模式深入解析(In Depth Analysis of Future Patterns)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

《TCP/IP网络编程》学习笔记 | Chapter 1:理解网络编程和套接字

《TCP/IP网络编程》学习笔记 | Chapter 1&#xff1a;理解网络编程和套接字 《TCP/IP网络编程》学习笔记 | Chapter 1&#xff1a;理解网络编程和套接字基本概念服务端客户端 基于 Linux 平台的 "Hello world!" 服务端和客户端基于 Linux 的文件操作打开文件关闭文件…

代理人工智能如何应对现代威胁的速度和数量

Seven AI首席执行官 Lior Div 讨论了代理 AI 的概念及其在网络安全中的应用。他解释了代理 AI 与传统自动化安全系统的区别&#xff0c;即代理 AI 具有更大的自主性和决策能力。 Div 强调&#xff0c;通过实时处理大量警报&#xff0c;代理 AI 特别适合对抗现代 AI 驱动的威胁…

【华为HCIP实战课程二十九】中间到中间系统协议IS-IS邻居关系建立和LSP详解,网络工程师

一、广播环境邻居关系建立详解 1、广播环境邻居关系建立 广播邻居关系采用三次握手,携带的邻居列表为接口的MAC来标识 2、LSP同步:3种报文(CSNP和PSNP和具体的LSP) CSNP作用类似DBD,请求者发送PSNP(类似LSR)来请求具体的LSP 广播网络LSP交互过程: R1-R2(DIS)--R3…

<HarmonyOS第一课>应用/元服务上架的课后习题

善者&#xff0c;吾善之&#xff1b; 不善者&#xff0c;吾亦善之&#xff0c;德善。 信者&#xff0c;吾信之&#xff1b; 不信者&#xff0c;吾亦信之&#xff0c;德信。 圣人在天下&#xff0c;歙歙焉为天下浑其心&#xff0c;百姓皆注其耳目&#xff0c;圣人皆孩之。 通过&…

九识智能与徐工汽车达成战略合作,共绘商用车未来新蓝图

近日&#xff0c;九识智能与徐工汽车签署战略合作协议&#xff0c;标志着双方在智能驾驶技术与新能源商用车融合应用、联合生产及市场推广等方面迈入深度合作的新篇章&#xff0c;将共同引领智能驾驶技术商业化浪潮。 近年来&#xff0c;在国家智能化发展战略的引领下&#xff…

根据Redis漏洞通知的整改修复过程

一、收到通知&#xff1a; 二、查看本校“宝山商城&#xff08;教学&#xff09;”已安装的Redis版本号 对照影响范围的版本号&#xff0c;在其内&#xff0c;所以需要升级Redis版本。 三、升级centos中的Redis版本 在Cent0S系统中&#xff0c;如果我们需要升级Redis版本&…

docker 可用镜像服务地址(2024.10.31亲测可用)

1.错误 Error response from daemon: Get “https://registry-1.docker.io/v2/” 原因&#xff1a;镜像服务器地址不可用。 2.可用地址 编辑daemon.json&#xff1a; vi /etc/docker/daemon.json内容修改如下&#xff1a; {"registry-mirrors": ["https://…

Git (推送到远端仓库)

目录 一、在 gitee 上创建一个仓库 二、将项目推送到远程仓库 三、解释推送命令 一、在 gitee 上创建一个仓库 操作如下&#xff1a; 二、将项目推送到远程仓库 这里例举新的项目推送到远程仓库的例子&#xff1a; 打开仓库查看&#xff1a; 三、解释推送命令 添加远程仓库…

opencv学习笔记(6):图像预处理(直方图、图像去噪)

3.直方图 直方图是用来表现图像中亮度分布的&#xff0c;给出的是图像中某个亮度或者某个范围亮度下共有几个像素&#xff0c;即统计一幅图某个亮度像素的数量。 直方图不能反映某一灰度值像素在图像中的位置&#xff0c;失去了图像的空间信息。图像直方图由于其计算代价较小&a…

《双指针篇》---移动零

题目传送门 这道题可以归类为 数组划分/数组分块 。 题目制定了一个规则&#xff0c;我们可以在这个规则下&#xff0c;将数组划分为若干个区间。 这道题让我们把所有非零元素移动到左边。所有零元素移动到右边。 将数组划分为&#xff1a; 左区间非0&#xff1b; 右区间&…

OpenHarmony、HarmonyOS、HarmonyNext互相兼容吗?

1&#xff0c;三者之间的关系 OpenHarmony&#xff1a;开源底层。HarmonyOS&#xff1a;闭源手机系统&#xff0c;兼容安卓生态。HarmonyOS NEXT&#xff1a;纯血鸿蒙&#xff0c;不兼容安卓。 上一篇文章简单介绍过&#xff0c;就不再多说了&#xff0c;这里说一下HarmonyOS …

Camera学习笔记(202410)

课程&#xff1a;CameraX&#xff1a;面向开发者的摄像头支持库 链接&#xff1a;CameraX&#xff1a;面向开发者的摄像头支持库_哔哩哔哩_bilibili 课程时长&#xff1a;28:00 学习时间&#xff1a;2024-10-29 概述&#xff1a;2019年Android CameraX的发布会 个人感觉&a…

Django入门教程——用户管理实现

第六章 用户管理实现 教学目的 复习数据的增删改查的实现。了解数据MD5加密算法以及实现模型表单中&#xff0c;自定义控件的使用中间件的原理和使用 需求分析 系统问题 员工档案涉及到员工的秘密&#xff0c;不能让任何人都可以看到&#xff0c;主要是人事部门进行数据的…

BugKu练习记录:矛盾

题目&#xff1a; $num$_GET[num]; if(!is_numeric($num)) { echo $num; if($num1) echo flag{**********}; }关键在于绕过is_numeric&#xff0c;PHP中字符串与数字弱比较&#xff0c;会将字符串转换为数字&#xff0c;截至到非数字字符&#xff0c;如果第一个字符就是非数字…

安宝特分享 | AR技术引领:跨国工业远程协作创新模式

在当今高度互联的工业环境中&#xff0c;跨国合作与沟通变得日益重要。然而&#xff0c;语言障碍常常成为高效协作的绊脚石。安宝特AR眼镜凭借其强大的多语言自动翻译和播报功能&#xff0c;正在改变这一局面&#xff0c;让远程协作变得更加顺畅。 01 多语言翻译优势 安宝特A…