【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;还能提高网页的可…

Vue3 生命周期 - 2024最新版前端秋招面试短期突击面试题【100道】

Vue3 生命周期 - 2024最新版前端秋招面试短期突击面试题【100道】 &#x1f504; 在Vue.js中&#xff0c;生命周期钩子是组件从创建到销毁过程中的一系列事件。理解Vue的生命周期对于掌握组件的行为和调试至关重要。Vue 3引入了Composition API&#xff0c;改变了生命周期函数…

刘艳兵-DBA021-升级到Oracle Database 12c时,关于使用Export/Import方法迁移数据的说法是正确的?

升级到Oracle Database 12c时&#xff0c;关于使用Export/Import方法迁移数据的说法是正确的&#xff1f; A 仅当源数据库在只读模式下没有任何表空间时&#xff0c;才可以使用它来迁移数据库。 B 仅当源数据库和目标数据库字节序相同时&#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;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

Q_GLOBAL_STATIC使用

作用&#xff1a;线程安全的全局静态变量初始化 声明&#xff1a; Q_GLOBAL_STATIC(MyType,globalState) Q_GLOBAL_STATIC_WITH_ARGS(MyType, globalState, (42, "Hello", "World")) //带参数的初始化 注&#xff1a; 构造函数和析构函数必须是公有的 如果…

《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 驱动的威胁…

Supabase:当开源遇上实时数据库服务

在当代应用开发的浪潮中,我们见证了无服务器架构和实时数据库服务的崛起。Firebase 的成功验证了这一方向,但同时也带来了供应商锁定的困扰。正是在这样的背景下,Supabase 横空出世,以开源的姿态为开发者提供了一个全新的选择。 为什么 Supabase 值得关注&#xff1f; 当我们…

【华为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;圣人皆孩之。 通过&…

游戏引擎中Static,Kinematic,Dynamic三种刚体属性

一.刚体属性 为了提高物理检测效率和内存使用,引擎只对特殊标识的刚体属性进行检测。包括常用的RayCast检测,BoxCast检测,AABB包围盒检测。 Static:实际游戏中不可能发生移动的房子,树木,建筑物等。引擎初始化进行Collider刷新 Kinematic:实际游戏中奇特的物体,传送门,陷阱等, …

【系统架构设计师】预测试卷一:论文(包括4篇论文主题对应的写作要点分析)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 试题一:论面向服务的架构设计与应用试题一写作要点试题二:论软件架构的脆弱性试题二 写作要点试题三:论分布式存储系统架构设计试题三 写作要点试题四:论网络安全体系架构设计及应用试题四 写作要点试题一:论面…

【如何获取股票数据30】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股炸板股池数据获取实例演示及接口API说明文档

最近一两年内&#xff0c;股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步&#xff0c;就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息&#xff0c;这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要任…

SpringBoot实现国密通信

SpringBoot实现国密通信 1. 生成支持国密的证书1.1 安装 GMSSL&#xff08;如果未安装&#xff09;1.2 生成 SM2 密钥对和证书 2. 配置 Spring Boot 项目使用 HTTPS2.1 项目 B&#xff1a;提供 HTTPS 接口2.2 项目 A&#xff1a;使用 HTTPS 调用项目 B 3. 启动和测试备注如何验…

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

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

基于深度学习的社交网络中的社区检测

在社交网络分析中&#xff0c;社区检测是一项核心任务&#xff0c;旨在将网络中的节点&#xff08;用户&#xff09;划分为具有高内部连接密度且相对独立的子群。基于深度学习的社区检测方法&#xff0c;通过捕获复杂的网络结构信息和节点特征&#xff0c;在传统方法基础上实现…

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

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