当前位置: 首页 > article >正文

【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 main

import (
    "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 User

        if err := c.ShouldBindJSON(&user); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }

        // Process user data
        c.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.kler.cn/a/376297.html

相关文章:

  • Wails不同平台打包
  • 云计算作业二Spark:问题解决备忘
  • 萤火虫算法优化BILSTM神经网络多输入回归分析
  • JAVA题目笔记(十一)多态+带有抽象类/接口的JavaBean类
  • CSGO: Content-Style Composition in Text-to-Image Generation(代码的复现)
  • 手动搭建koa+ts项目框架(node开发配置环境变量)
  • 【element el-date-picker限制时间选择范围】
  • 鸿蒙生态:机遇与挑战
  • 一对一直播源码搭建部署环境说明
  • 【性能测试】jmeter如何写入数据到文件,做持久化保存
  • linux之网络子系统-用户层接收数据包之多路复用方案(epoll)
  • jenkins 构建报错 mvn: command not found
  • 高压线路覆冰厚度测量,输电线路微波覆冰监测装置守护电网安全
  • 【Python系列】poetry安装与使用
  • WPF+MVVM案例实战(十八)- 自定义字体图标按钮的封装与实现(ABD类)
  • arcgis坐标系问题
  • 虚拟机指定固定ip地址
  • 自然语言处理(文本预处理基础)
  • Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
  • Go语言的使用
  • 高级SQL技巧详解与实例
  • 华为机试HJ17 坐标移动
  • 《手写Spring渐进式源码实践》实践笔记(第十四章 通过注解自动注入属性信息)
  • JDK动态代理为什么只能代理有接口的类?
  • 【原创分享】生产环境JAVA中间件性能优化调优要点和案例分析
  • 面向过程与面向对象