首页 > 其他分享 >Go Gin 框架的模型绑定与验证详解

Go Gin 框架的模型绑定与验证详解

时间:2024-02-19 10:00:48浏览次数:33  
标签:form 验证 绑定 gin Go Gin

Go Gin 框架的模型绑定与验证详解

原创 云原生Go 源自开发者 2024-02-18 23:22 广东 听全文 源自开发者 专注于提供关于Go语言的实用教程、案例分析、最新趋势,以及云原生技术的深度解析和实践经验分享。 119篇原创内容 公众号

在Web开发中,模型绑定和验证是确保数据完整性和减少安全风险的重要步骤。Go语言的Gin框架提供了强大而灵活的模型绑定和验证机制,本文将深入讲解Gin框架中如何进行模型绑定和验证,以及如何自定义验证器。

在Gin框架中,模型绑定通常指将请求的数据(例如JSON、表单数据)绑定到指定的结构体上,而验证则是确保绑定后的数据符合我们设置的规则。Gin框架使用binding标签来实现模型的绑定和验证。

使用Gin进行模型绑定

安装Gin

首先,确保你已经安装了Go环境,并通过如下命令安装Gin框架:

go get -u github.com/gin-gonic/gin

定义模型

在开始绑定之前,需要定义一个结构体来表示我们的数据模型:

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

type LoginForm struct {
    Username string `form:"username" binding:"required"`
    Password string `form:"password" binding:"required"`
}

在这个结构体中,我们使用了form来指定表单中的字段名,binding:"required"表示这些字段是必填的。

绑定请求

要绑定请求数据到结构体,我们可以在Gin的HandlerFunc中使用ShouldBind等方法:

func main() {
    router := gin.Default()

    router.POST("/login", func(c *gin.Context) {
        var form LoginForm
        if err := c.ShouldBind(&form); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        // 如果绑定成功,继续处理
        c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
    })

    router.Run(":8080")
}

进行数据验证

Gin框架通过结合validator.v9库进行数据验证。以下是如何使用Gin进行数据验证的步骤:

增加验证规则

我们可以在绑定的标签中使用binding关键字来增加验证规则:

type LoginForm struct {
    Username string `form:"username" binding:"required,alphanum,min=5,max=10"`
    Password string `form:"password" binding:"required,min=8"`
}

管理中指定了用户名必须是字母和数字的结合,并且长度至少5位最多10位;密码必须至少8位。

自定义验证器

如果预设的验证规则不满足需求,我们还可以自定义验证器。例如,我们想验证用户名是否包含特定的前缀:

package main

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

// 定义LoginForm结构体,并使用自定义验证
type LoginForm struct {
    Username string `form:"username" binding:"required,usernamePrefix"`
    Password string `form:"password" binding:"required,min=8"`
}

// 自定义验证器的函数签名
func usernamePrefixValidator(fl validator.FieldLevel) bool {
    return strings.HasPrefix(fl.Field().String(), "prefix_")
}

func main() {
    router := gin.Default()

    if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
        // 注册自定义验证器
        v.RegisterValidation("usernamePrefix", usernamePrefixValidator)
    }

    router.POST("/login", func(c *gin.Context) {
        var form LoginForm
        // 绑定和验证
        if err := c.ShouldBind(&form); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        // 处理登录逻辑...
        c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
    })

    router.Run(":8080")
}

在上述代码中,我们通过调用RegisterValidation函数注册了一个名为"usernamePrefix"的自定义验证器。

总结

通过使用Gin框架的强大功能,我们可以轻松地对Web应用进行模型绑定和验证。它不单只提供内置的验证规则,而且还允许开发者自定义复杂的验证逻辑。正确地使用模型绑定和验证能够帮助我们更高效地开发安全的Web应用程序。

 

文章精选

Go Gin实现HTTP/2 Server推送

Go语言官方团队推荐的依赖注入工具

替代zap,Go语言官方实现的结构化日志包

Go语言常见错误 | 不使用function option模式

必看| Go语言项目结构最佳实践

 

点击关注并扫码添加进交流群领取「Go 语言」学习资料

图片

Gin14 Gin · 目录 上一篇Go语言中的Gin框架和多模板应用 阅读 196 源自开发者 ​ 喜欢此内容的人还喜欢   Go语言中的Gin框架和多模板应用     源自开发者 不看的原因   基于Gin框架的热加载方案,大大提高开发效率!     源自开发者 不看的原因   Go:并发编程实践,Gin框架的Context复制机制     运维开发王义杰 不看的原因   发消息              

人划线

标签:form,验证,绑定,gin,Go,Gin
From: https://www.cnblogs.com/cheyunhua/p/18020471

相关文章

  • ubuntu Fix The Google GPG Error on Ubuntu
    想装下node.js,结果ubuntu输入aptupdate环境炸了,原因是google的GPGkey更新了报错(base)woodx@Machine:~$sudoaptupdateGet:1file:/var/cudnn-local-repo-ubuntu1804-8.8.1.3InRelease[1,572B]Get:2file:/var/nv-tensorrt-local-repo-ubuntu1804-8.5.1-cuda-11.8InR......
  • go-zero/grpc的rpc服务间传递额外数据
    客户端:md:=metadata.New(map[string]string{"signature":"0123456789","timestamp":"2021-07-0100:00:00"})ctx:=metadata.NewOutgoingContext(ctx,md)addResp,err:=adderClient.Add(ctx,addReq)//rpc调用初始化md也可......
  • google chrome 获取书签的添加日期
    有的时候想找一个书签的添加日期,在浏览器上貌似看不到 设备:win10google书签位置:username是你的用户名C:\Users\username\AppData\Local\Google\Chrome\UserData\Default\Bookmarkspython获取数据importpandasaspdimportjsonimportdatetimewithopen......
  • OpenResty 介绍与实战讲解(nginx&lua)
    目录一、概述二、OpenResty安装三、OpenResty的工作原理四、OpenResty核心模块1)ngx_lua模块2)ngx_stream_lua模块3)ngx_http_lua_module模块4)ngx_http_headers_more模块5)ngx_http_echo模块6)ngx_http_lua_upstream模块7)ngx_http_redis模块8)ngx_http_proxy_connect_module......
  • RunnerGo:UI自动化测试神器!
    UI自动化测试已经成为现代软件开发过程中不可或缺的一部分。它能够提供诸多优势,包括提高测试效率、减少人力成本、提升软件质量等。同时,可视化工具为UI自动化测试带来了更多便利和灵活性。RunnerGo近期上线脚本录制器,根据你的测试操作直接生成UI自动化测试脚本,下面是使用方法Step......
  • nginx ip分流
    需求将尾号ip为0或者为具体ip的真实用户转发至其他云服务上架构阿里云slb-->k8snginxingress-->nginxpod(以下nginx配置为nginxpod里的转发配置)nginxip分流(以ip尾号为0或者1的客户端ip进行分流)root/data/build;location/{#if(\$http_x_f......
  • 饮冰十年-人工智能-ArangoDB-03-AQL
    上一篇:饮冰十年-人工智能-ArangoDB-02-AQLvsSQL本课程的示例数据集基于小说和电视连续剧《三国演义》。它包括两种语言的性格特征、一些人物关系,以及一小部分地点。ToDo:整体完成后补充一、基本CRUD操作1、创建集合我们无法使用AQL创建集合,我们将使用Web界面创建集合......
  • Auth2 django 接入
    原理Auth2的协议说明  https://oauth.net/2/ 相关python包推荐https://oauth.net/code/ 概述场景适用有一个"快浪"的论坛网站,访问者必须要注册用户后才可访问,且允许直接基于 QQ 关联注册,登录访问QQ 不是很随便的怕平台,基于用户授权后,才会同意 快......
  • nginx做白名单和限流
    ​ 在我们生产环境中使用到了地图服务,每个月有免费请求次数,近一个月请求次数突然暴涨,导致直接开启付费模式,一个月上百刀的花销着实难扛,根据实际我们的业务使用情况,远达不到付费标准,故考虑做白名单和限流措施,基于以上情况并遇到春节急需快速处理,所以选择了最简单方便的方式,通过ngin......
  • Go语言指南练习:等价二叉查找树
    题目:不同二叉树的叶节点上可以保存相同的值序列。例如,以下两个二叉树都保存了序列1,1,2,3,5,8,13。在大多数语言中,检查两个二叉树是否保存了相同序列的函数都相当复杂。我们将使用Go的并发和信道来编写一个简单的解法。本例使用了tree包,它定义了类型:typeTreestruct{Lef......