Gin中数据解析和绑定的几种方法实现

 更新时间:2025年11月21日 10:47:01   作者:程序员WZ  
本文主要介绍了Gin中数据解析和绑定的几种方法实现,包括Json数据、表单数据和URI数据,每种类型的数据都有其特定的解析和绑定方法,下面就一起来了解一下

概要

Gin数据解析和绑定可以分为三类

  • Json数据的解析和绑定
  • 表单数据的解析和绑定
  • URI数据的解析和绑定

我们来分别讲解各自的数据类型以及对应的绑定和解析

Json数据解析和绑定

Json数据要解析到结构体时,需要在结构体标签中用到json标签,用于序列化Json数据并对应到结构体中

我们使用Context包下的ShouldBindJSON()方法将请求中传递的Json数据解析到结构体中

代码实现

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

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

		if form.Username != "root" || form.Password != "root" {
			c.JSON(http.StatusBadRequest, gin.H{"error": "304"})
			return
		}
		c.JSON(http.StatusOK, gin.H{"data": form})
	})
	r.Run(":8080")
}
}

注意:

在结构体定义的时候一定要带上json标签,json标签的作用是让发送的json字符串数据能够对应到结构体字段上。

ShouldBindJSON()的作用是什么?该方法可以将前端传递的json格式数据自动解析到结构体上,并配合结构体中的json标签进行精准映射,简化了数据绑定过程

测试

这里我使用的工具是ApiFox
在工具中发送post请求,这里我们需要使用json格式发送,不能用query参数

表单数据解析和绑定

什么是表单数据?很简单,就是前端使用表单组件来提交数据的格式
表单数据也是键值对形式存储的,并且不支持嵌套。 username=root&password=root

前端实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form action="http://localhost:8080/login" method="post" enctype="application/x-www-form-urlencoded">
        用户名<input type="text" name="username">

        密码<input type="password" name="password">
        <input type="submit" value="提交">
    </form>
</body>
</html>

这里指定了表单的编码方式为enctype="application/x-www-form-urlencoded"

后端实现

这里我们可以使用ShouldBind()或者Bind()方法进行数据解析

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

func main() {
	r := gin.Default()
	r.POST("/login", func(c *gin.Context) {
		var form Login
		fmt.Println(form)
		if err := c.ShouldBind(&form); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}
		if form.Username != "root" || form.Password != "root" {
			c.JSON(http.StatusBadRequest, gin.H{"error": "304"})
			return
		}
		c.JSON(http.StatusOK, gin.H{"data": form})
	})
	r.Run(":8080")
}

注意

注意结构体的标签中使用form标签,这样配合ShouldBind()方法可以将表单数据解析到结构体并对应到相应字段上

测试

打开本地创建的html文件,将前端代码复制到文件中,保存后在浏览器中打开

这里我们的用户名和密码都是root
发送请求后,页面应该响应出来一个json格式的数据

至于错误的用户名和密码是什么效果,可以自行测试

URI数据解析和绑定

什么是URI?注意是uri,不是url。url是uri的子集,这里我们只需要知道uri可以是url,也就是我们访问资源的时候,斜杠后边的内容,即访问路径。

比如localhost:8080/login/root/root,这时候可以把uri看成url,并且我们可以通过shouldBindUri()将路径中的两个root进行数据解析,解析到Login结构体中,并且通过结构体中的uri标签,将数据映射到对应的结构体字段上。

代码实现

type Login struct {
	Username string `form:"username" json:"username" uri:"username" binding:"required"`
	Password string `form:"password" json:"password" uri:"password" binding:"required"`
}

func main() {
	r := gin.Default()
	r.GET("/:username/:password", func(c *gin.Context) {

		var form Login
		if err := c.ShouldBindUri(&form); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}
		if form.Username != "root" || form.Password != "root" {
			c.JSON(http.StatusBadRequest, gin.H{"status": 304})
			return
		}
		c.JSON(http.StatusOK, gin.H{"status": 200})
	})
	r.Run(":8080")
}

注意

结构体中要带上uri标签,这样可以结合ShouldBindUri进行数据绑定的简化

测试

我们打开浏览器,输入localhost:8080/root/root,这里和我们的代码中定义的路径对应,代码中没有写login/:username/:password那我们请求时也不带login,并且代码中定义的只返回一个200状态码,这些内容都可以根据实际情况进行更改

此时,三种类型的数据解析和绑定我们就都测试完毕

小结

从上边的三个demo可以看到,gin处理这些不同类型的数据对应了不同的方法,我们需要使用正确的方法进行处理,保证了代码的灵活性,也可以减少错误率

到此这篇关于Gin中数据解析和绑定的几种方法实现的文章就介绍到这了,更多相关Gin中数据解析和绑定内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 全面解析Golang 中的 Gorilla CORS 中间件正确用法

    全面解析Golang 中的 Gorilla CORS 中间件正确用法

    Golang 中使用 gorilla/mux 路由器配合 rs/cors 中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配置不生效的问题,本文将详细介绍其正确用法,感兴趣的朋友一起看看吧
    2025-07-07
  • 使用Golang读取toml配置文件的代码实现

    使用Golang读取toml配置文件的代码实现

    在开发过程中,配置文件是必不可少的一部分,它使我们能够在不更改代码的情况下更改应用程序的行为,TOML是一种简单易读的配置文件格式,本文将介绍如何使用Golang来读取TOML配置文件,需要的朋友可以参考下
    2024-04-04
  • Golang线程池与协程池的使用

    Golang线程池与协程池的使用

    在Golang中,线程池和协程池是非常常见且重要的概念,它们可以提高应用程序的并发处理能力和性能,减少资源的浪费,本文就来介绍一下Golang线程池与协程池的使用,感兴趣的可以了解一下
    2024-04-04
  • Go语言实现动态开点线段树详解

    Go语言实现动态开点线段树详解

    线段树是一种用于高效处理区间查询和区间更新的数据结构,下面我们就来看看如何使用Go实现动态开点线段树的方式,感兴趣的可以了解下
    2025-02-02
  • 深入理解Go gin框架中Context的Request和Writer对象

    深入理解Go gin框架中Context的Request和Writer对象

    这篇文章主要为大家详细介绍了Go语言的gin框架中Context的Request和Writer对象,文中的示例代码讲解详细,对我们深入了解Go语言有一定的帮助,快跟随小编一起学习一下吧
    2023-04-04
  • Go实现文件上传和下载

    Go实现文件上传和下载

    这篇文章主要为大家详细介绍了Go实现文件上传和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Golang IPv4 字符串与整数互转方式

    Golang IPv4 字符串与整数互转方式

    这篇文章主要介绍了Golang IPv4 字符串与整数互转方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • go语言中函数与方法介绍

    go语言中函数与方法介绍

    这篇文章介绍了go语言中的函数与方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Go语言创建结构体实例对象的几种常用方式

    Go语言创建结构体实例对象的几种常用方式

    在Go语言中,创建结构体实例的几种方式有本质区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • 简单谈谈Golang中的字符串与字节数组

    简单谈谈Golang中的字符串与字节数组

    这篇文章主要给大家介绍了关于Golang中字符串与字节数组的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Golang具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03

最新评论