首页 > 其他分享 >Go: Gin框架中的binding验证器使用指南

Go: Gin框架中的binding验证器使用指南

时间:2024-07-29 09:40:20浏览次数:7  
标签:err 验证 binding gin Go Gin validate

Go: Gin框架中的binding验证器使用指南

原创 王义杰 AI学者王义杰    2024年05月30日 22:33 广东 听全文

在Gin框架中,数据绑定和验证是开发API时不可或缺的部分。Gin提供了强大的binding功能,允许我们将请求的数据绑定到结构体,并通过标签进行数据验证。本文将详细讲解如何在Gin中使用binding验证器进行数据验证,并提供代码示例帮助理解。

一、Gin框架简介

Gin是一个用Go语言编写的高性能Web框架,具有简单易用、速度快、灵活性高等特点。Gin通过中间件机制扩展功能,支持路由、参数解析、数据绑定和验证等功能,非常适合开发RESTful API。

二、binding功能介绍

Gin的binding包提供了一组功能,用于将请求的数据自动绑定到结构体,并根据结构体标签进行数据验证。常用的标签有bindingvalidate,通过这些标签可以指定数据的类型和验证规则。

常见标签

  • binding:"required":表示该字段为必填项

  • binding:"-":忽略该字段,不进行绑定

  • validate:"max=10":表示该字段的值不能超过10

  • validate:"min=1":表示该字段的值不能小于1

  • validate:"email":表示该字段必须是合法的邮箱格式

结构体定义示例

 

go

type User struct {
Name string `json:"name" binding:"required" validate:"min=3,max=20"`
Email string `json:"email" binding:"required" validate:"email"`
Age int `json:"age" binding:"required" validate:"min=1,max=100"`
}

在上述示例中,我们定义了一个User结构体,并为每个字段添加了binding和validate标签,指定了各字段的绑定和验证规则。

三、Gin中使用binding和验证器

图片

1. 安装Gin和validator

首先,我们需要安装Gin框架和validator库,可以使用以下命令进行安装:

 

sh

go get -u github.com/gin-gonic/gin
go get -u github.com/go-playground/validator/v10

go-playground/validator是一个用于 Go 语言的结构体和字段验证包。它具有以下特点:

  • 支持跨字段和跨结构体验证

  • 支持自定义验证器

  • 提供丰富的验证约束

  • 易于使用

以下是该包的一些常见用途:

  • 验证 API 请求参数

  • 验证表单数据

  • 验证数据库模型

2. 绑定数据并验证

在Gin中,我们可以通过ShouldBindShouldBindJSON方法将请求的数据绑定到结构体,并进行验证。下面是一个具体的示例:

 

go

package main

import (
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"net/http"
)

// User 结构体
type User struct {
Name string `json:"name" binding:"required" validate:"min=3,max=20"`
Email string `json:"email" binding:"required" validate:"email"`
Age int `json:"age" binding:"required" validate:"min=1,max=100"`
}

// CustomValidator 自定义验证器
type CustomValidator struct {
validate *validator.Validate
}

// ValidateStruct 验证结构体
func (cv *CustomValidator) ValidateStruct(obj interface{}) error {
if err := cv.validate.Struct(obj); err != nil {
return err
}
return nil
}

// Main 函数
func main() {
r := gin.Default()
r.Use(func(c *gin.Context) {
cv := &CustomValidator{validate: validator.New()}
c.Set("validator", cv)
})

r.POST("/user", func(c *gin.Context) {
var user User
if err := c.ShouldBind(&user); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}

if v, ok := c.MustGet("validator").(*CustomValidator); ok {
if err := v.ValidateStruct(&user); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
}

c.JSON(http.StatusOK, gin.H{"message": "User created successfully!", "user": user})
})

r.Run()
}

3. 自定义验证器

有时,内置的验证器无法满足我们的需求,我们可以定义自己的验证器。例如,我们希望验证用户名不能包含特殊字符,可以通过自定义验证器实现:

 

go

package main

import (
"net/http"
"unicode"

"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
)

// User 结构体
type User struct {
Name string `json:"name" binding:"required" validate:"min=3,max=20"`
Email string `json:"email" binding:"required" validate:"email"`
Age int `json:"age" binding:"required" validate:"min=1,max=100"`
}

func isValidUsername(fl validator.FieldLevel) bool {
username := fl.Field().String()
for _, char := range username {
if !unicode.IsLetter(char) && !unicode.IsDigit(char) {
return false
}
}
return true
}

func main() {
r := gin.Default()
validate := validator.New()
validate.RegisterValidation("username", isValidUsername)

r.POST("/user", func(c *gin.Context) {
var user User
if err := c.ShouldBind(&user); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}

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

c.JSON(http.StatusOK, gin.H{"message": "User created successfully!", "user": user})
})

r.Run()
}

在上述示例中,我们通过validate.RegisterValidation方法注册了一个自定义验证器isValidUsername,用于验证用户名是否包含特殊字符。

四、错误处理

在实际开发中,数据验证错误需要及时反馈给客户端。Gin的binding验证器会在数据验证失败时返回详细的错误信息,我们可以根据这些错误信息进行处理:

 

go

func handleError(err error) string {
if errs, ok := err.(validator.ValidationErrors); ok {
var errMsgs []string
for _, e := range errs {
errMsgs = append(errMsgs, fmt.Sprintf("Field: %s, Error: %s", e.Field(), e.Tag()))
}
return strings.Join(errMsgs, ", ")
}
return err.Error()
}

通过上述handleError函数,我们可以将验证错误格式化为易于阅读的错误信息。

五、总结

Gin框架中的binding验证器为我们提供了简便的数据绑定和验证功能,通过合理使用binding和validate标签,我们可以确保API接口的数据合法性和完整性。此外,结合自定义验证器和错误处理机制,可以进一步提高数据验证的灵活性和用户体验。

希望通过本文的讲解,大家能够熟练掌握Gin框架中的binding验证器,并在实际项目中灵活运用。如果有任何问题或建议,欢迎在评论区留言讨论。

王义杰

赞赏二维码喜欢作者

go391 软件开发752 gin4 go · 目录 上一篇Go:UDP编程指南下一篇Go:依赖注入设计模式温故 阅读 327 ​

标签:err,验证,binding,gin,Go,Gin,validate
From: https://www.cnblogs.com/cheyunhua/p/18329414

相关文章

  • Vue3 - 最新详细实现安装使用 Google 谷歌地图教程,提供搜索城市名称及地点(搜索关键字
    前言如果您需要Vue2版本,请访问这篇文章。在vue3|nuxt3网站开发中,详解实现接入谷歌google地图申请密钥及相关配置完整流程,附带使用谷歌地图相关功能示例代码,支持地图渲染展示、在地图上标点、全球地图搜索及搜索框相关联想关键词、地图导航、用户当前位置经纬度......
  • Django REST Framework(十四)路由Routes
    如何在DjangoRESTframework中利用SimpleRouter和DefaultRouter来高效生成视图集的路由信息,并详细解释如何使用action装饰器为视图集中的自定义方法生成路由1.1使用Routers创建router对象并注册视图集在创建router对象并注册视图集时,我们会定义一个视图集并注册到ro......
  • train_test_split 导致 xgboost 忽略“enable_categorical”
    我正在使用xgboost版本2.1.0当使用xgboost.DMatrix()和'enable_categorical'=True将包含类别列的pandas数据帧转换为DMatrix时,所有行为均按预期运行,除非数据帧是sklearntrain_test_split()返回的数据帧,尽管所有列的数据类型仍属于类别。以下代码产生预期的......
  • 如何优化 Django 自动重载/启动过程?
    我目前正在开发一个非常大的Django项目,其中包含许多文件,更重要的是,还有大量依赖项,包括Torch和Transformers等包。自从安装Torch以来,我注意到自动重新加载功能和整个启动过程使用开发服务器时的过程变得非常慢。现在我需要10-15秒才能测试我的代码,这在开发过程中非......
  • Django Admin TabularInline:如何通过模型隐藏 M2M 的对象名称?
    如何在管理显示中隐藏Unit_attributeobject(3)?admin.py:fromdjango.contribimportadminfromcore.modelsimportAttribute,UnitclassUnitAttributeInline(admin.TabularInline):[email protected]......
  • 解决yolo使用engine模型推理报错AttributeError: “NoneType’cbject has no attribut
    目录起因分析两种解决方案方法一:卸载生产服务器的tensorrt,下载与训练服务器相同版本方法二:将训练服务器训练的pt模型下载出来到生产服务器导出起因在做yolo模型训练时使用了训练服务器,训练结束把模型转换成了.engine模型,在训练服务器上可以正常使用,但把模型放到生成服......
  • 使用celery进行异步处理和定时任务(django)
    一、celery的作用    celery是一个简单、灵活且可靠的分布式系统,用于处理大量消息,同时为操作提供一致的接口。它专注于实时操作,但支持任务调度。Celery主要用于异步任务处理,特别是在Web应用环境中,用于执行后台任务,如发送电子邮件、处理图片、视频转码、运行复杂的......
  • Flutter网络错误全解析:当“A network error occurred“遇上“https://maven.google.co
    摘要:在Flutter开发过程中,我们经常需要从远程仓库获取依赖包,而https://maven.google.com/是Flutter依赖的主要来源之一。然而,开发者可能会遇到"Anetworkerroroccurredwhilechecking‘https://maven.google.com/’"的错误提示。本文将从资深Flutter开发专家的角度出发,......
  • gorm中使用乐观锁
    乐观锁简介乐观锁(又称乐观并发控制)是一种常见的数据库并发控制策略。乐观并发控制多数用于数据竞争(datarace)不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,因此可以获得比其他并发控制方法更高的吞吐量。它的作用是防止并发更新数据......
  • 【Golang 面试 - 进阶题】每日 3 题(三)
    ✍个人博客:Pandaconda-CSDN博客......