Gin框架操作指南04:GET绑定

官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/
注:没用过Gin的读者强烈建议先阅读第一节:Gin操作指南:开山篇。
本节演示GET绑定,包括绑定表单数据至自定义结构体,绑定查询字符串或表单数据,只绑定url查询字符串,查询字符串参数,设置和获取Cookie 从reader读取数据。在开始之前,我们需要在”02请求参数处理“目录下打开命令行,执行如下命令来创建子目录:

mkdir 绑定表单数据至自定义结构体 绑定查询字符串或表单数据 只绑定url查询字符串 查询字符串参数 设置和获取Cookie 从reader读取数据

然后下载安装postman,注册登录后,点击新建,如图
在这里插入图片描述

目录

    • 一、绑定表单数据至自定义结构体
    • 二、绑定查询字符串或表单数据
    • 三、只绑定url查询字符串
    • 四、查询字符串参数
    • 五、从reader读取数据
    • 六、设置和获取Cookie

一、绑定表单数据至自定义结构体

package main

import (
	"github.com/gin-gonic/gin" // 引入 gin-gonic/gin 包,用于构建 HTTP 服务
)

// StructA 定义一个结构体,包含一个字段 FieldA,绑定表单字段 field_a
type StructA struct {
	FieldA string `form:"field_a"` // 绑定来自表单数据的 field_a
}

// StructB 定义一个包含嵌套结构体和其他字段的结构体
type StructB struct {
	NestedStruct StructA // 嵌套的 StructA 结构体
	FieldB       string  `form:"field_b"` // 绑定来自表单数据的 field_b
}

// StructC 定义一个包含指向嵌套结构体的指针和其他字段的结构体
type StructC struct {
	NestedStructPointer *StructA // 指向嵌套的 StructA 结构体的指针
	FieldC              string   `form:"field_c"` // 绑定来自表单数据的 field_c
}

// StructD 定义一个包含嵌套匿名结构体和其他字段的结构体
type StructD struct {
	NestedAnonyStruct struct {
		FieldX string `form:"field_x"` // 绑定来自表单数据的 field_x
	} // 嵌套的匿名结构体
	FieldD string `form:"field_d"` // 绑定来自表单数据的 field_d
}

// GetDataB 处理 GET 请求,将表单数据绑定至 StructB,并返回 JSON 响应
func GetDataB(c *gin.Context) {
	var b StructB // 创建 StructB 的实例
	c.Bind(&b)    // 将请求中的表单数据绑定到结构体 b

	// 返回 JSON 响应,包含结构体 b 的字段
	c.JSON(200, gin.H{
		"a": b.NestedStruct, // 返回 NestedStruct
		"b": b.FieldB,       // 返回 FieldB
	})
}

// GetDataC 处理 GET 请求,将表单数据绑定至 StructC,并返回 JSON 响应
func GetDataC(c *gin.Context) {
	var b StructC // 创建 StructC 的实例
	c.Bind(&b)    // 将请求中的表单数据绑定到结构体 b

	// 返回 JSON 响应,包含结构体 b 的字段
	c.JSON(200, gin.H{
		"a": b.NestedStructPointer, // 返回 NestedStructPointer
		"c": b.FieldC,              // 返回 FieldC
	})
}

// GetDataD 处理 GET 请求,将表单数据绑定至 StructD,并返回 JSON 响应
func GetDataD(c *gin.Context) {
	var b StructD // 创建 StructD 的实例
	c.Bind(&b)    // 将请求中的表单数据绑定到结构体 b

	// 返回 JSON 响应,包含结构体 b 的字段
	c.JSON(200, gin.H{
		"x": b.NestedAnonyStruct, // 返回 NestedAnonyStruct
		"d": b.FieldD,            // 返回 FieldD
	})
}

// main 函数设置路由并启动服务器
func main() {
	r := gin.Default() // 创建默认的 Gin 路由引擎

	// 设置路由,绑定处理函数
	r.GET("/getb", GetDataB) // 处理 GET 请求 /getb
	r.GET("/getc", GetDataC) // 处理 GET 请求 /getc
	r.GET("/getd", GetDataD) // 处理 GET 请求 /getd

	r.Run() // 启动服务器,监听默认端口 8080
}

效果
在这里插入图片描述

二、绑定查询字符串或表单数据

package main

import (
	"log" // 引入 log 包,用于日志输出

	"github.com/gin-gonic/gin" // 引入 gin-gonic/gin 包,用于构建 HTTP 服务
)

// 定义一个结构体 Person,用于绑定请求中的数据
type Person struct {
	Name    string `form:"name" json:"name"`       // `form:"name"` 用于表单提交,`json:"name"` 用于 JSON 请求
	Address string `form:"address" json:"address"` // `form:"address"` 用于表单提交,`json:"address"` 用于 JSON 请求
}

func main() {
	route := gin.Default() // 创建一个 gin 路由实例,带有默认的日志和恢复中间件

	// 处理 GET 请求的路由,访问 /testing 路由时,调用 startPage 函数处理请求
	route.GET("/testing", startPage)

	// 运行服务器,监听 8085 端口
	route.Run(":8085")
}

// 处理请求的函数,绑定并处理表单和 JSON 数据
func startPage(c *gin.Context) {
	var person Person // 定义 Person 结构体变量,用于接收绑定的数据

	// 尝试从查询字符串中绑定数据 (name 和 address)
	if c.Bind(&person) == nil { // c.Bind 自动根据请求的 Content-Type 选择合适的绑定方法
		log.Println("====== Bind By Query String ======") // 绑定成功后,打印日志
		log.Println(person.Name)                          // 打印绑定的 Name
		log.Println(person.Address)                       // 打印绑定的 Address
	}

	// 尝试从 JSON 请求体中绑定数据
	if c.BindJSON(&person) == nil { // 使用 BindJSON 方法,专门用于绑定 JSON 数据
		log.Println("====== Bind By JSON ======") // 绑定成功后,打印日志
		log.Println(person.Name)                  // 打印绑定的 Name
		log.Println(person.Address)               // 打印绑定的 Address
	}

	// 返回响应给客户端,状态码 200,内容为 "Success"
	c.String(200, "Success")
}

通过查询字符串测试
在这里插入图片描述
通过 Postman 发送 JSON 数据测试
使用 Postman 创建一个新的请求,方法选择 GET,URL 为 http://localhost:8085/testing。
在 Body 选项卡中按下图设置,点击send即可看到效果:
在这里插入图片描述

三、只绑定url查询字符串

package main

import (
	"log" // 引入 log 包,用于日志输出

	"github.com/gin-gonic/gin" // 引入 gin-gonic/gin 包,用于创建 HTTP web 框架
)

// 定义一个 Person 结构体,用于接收查询参数中的 name 和 address
type Person struct {
	Name    string `form:"name"`    // form:"name" 指定该字段从查询参数 name 中提取
	Address string `form:"address"` // form:"address" 指定该字段从查询参数 address 中提取
}

func main() {
	route := gin.Default() // 创建一个 Gin 实例,带有默认的日志和恢复中间件

	// route.Any 注册一个处理所有 HTTP 方法(GET、POST、PUT 等)到 /testing 路由的处理器函数
	route.Any("/testing", startPage)

	// 监听并启动服务,监听的端口为 8085
	route.Run(":8085")
}

// 处理请求的处理器函数
func startPage(c *gin.Context) {
	var person Person // 创建一个 Person 结构体实例,用于接收请求中的数据

	// 通过 BindQuery 绑定查询字符串参数,即从 URL 中的查询参数绑定 name 和 address
	// 例如:/testing?name=John&address=NewYork
	if c.BindQuery(&person) == nil { // 如果绑定没有出错,返回 nil
		// 绑定成功后打印日志,输出绑定的 name 和 address
		log.Println("====== Only Bind Query String ======") // 输出绑定信息的提示日志
		log.Println(person.Name)                            // 输出绑定的 Name 值
		log.Println(person.Address)                         // 输出绑定的 Address 值
	}

	// 返回 HTTP 状态码 200,和字符串 "Success" 作为响应内容
	c.String(200, "Success")
}

效果
在这里插入图片描述

四、查询字符串参数

package main

import (
	"net/http"          // 导入 HTTP 包,用于处理 HTTP 状态码等
	"github.com/gin-gonic/gin" // 导入 Gin 框架包,用于创建 HTTP Web 服务器
)

func main() {
	// 使用 gin.Default() 创建一个默认的 Gin 路由器实例
	// 默认情况下,包含了日志和恢复中间件(用于记录请求日志和处理服务器崩溃时的恢复)
	router := gin.Default()

	// 定义一个 GET 请求的路由处理函数,用于处理 "/welcome" 路由
	// 这个路由会接收 URL 查询参数(Query Parameters),并返回个性化的响应
	// 示例 URL:/welcome?firstname=Jane&lastname=Doe
	router.GET("/welcome", func(c *gin.Context) {
		// 使用 c.DefaultQuery 方法解析 URL 中的 "firstname" 查询参数
		// 如果查询参数不存在,则返回默认值 "Guest"
		firstname := c.DefaultQuery("firstname", "Guest")
		
		// 使用 c.Query 方法获取 URL 中的 "lastname" 查询参数
		// c.Query 是 c.Request.URL.Query().Get("lastname") 的简化版本
		lastname := c.Query("lastname")

		// 使用 c.String 返回一个字符串作为响应
		// 其中包含 HTTP 状态码 http.StatusOK(即 200),并将解析出的 "firstname" 和 "lastname" 插入到响应消息中
		// 如果查询参数没有提供,默认会使用 "Guest" 作为 firstname
		c.String(http.StatusOK, "Hello %s %s", firstname, lastname)
	})

	// 运行 Gin 服务器,监听在本地的 8080 端口上
	router.Run(":8080")
}

效果
在这里插入图片描述

五、从reader读取数据

package main

import (
	"net/http" // 导入 HTTP 包,用于处理 HTTP 请求和响应

	"github.com/gin-gonic/gin" // 导入 Gin 框架包,用于创建 HTTP Web 服务器
)

func main() {
	// 使用 gin.Default() 创建一个默认的 Gin 路由器实例
	router := gin.Default()

	// 定义一个 GET 请求的路由处理函数,用于处理 "/someDataFromReader" 路由
	// 这个路由会从远程 URL 获取数据,并通过 Gin 将该数据发送给客户端
	router.GET("/someDataFromReader", func(c *gin.Context) {
		// 使用 http.Get 方法发起 HTTP GET 请求,尝试从远程服务器获取图像文件
		response, err := http.Get("https://img2.baidu.com/it/u=3545291696,228271590&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=1186")

		// 检查是否发生错误,或者返回的 HTTP 状态码是否不是 200 OK
		// 如果发生错误或者状态码不是 200,则返回 HTTP 503 服务不可用状态
		if err != nil || response.StatusCode != http.StatusOK {
			c.Status(http.StatusServiceUnavailable)
			return
		}

		// 获取响应的 Body(即图像文件的二进制数据)
		reader := response.Body

		// 获取文件的内容长度,用于设置响应头中的 Content-Length
		contentLength := response.ContentLength

		// 获取响应头中的 Content-Type,通常是文件的 MIME 类型(如 "image/png")
		contentType := response.Header.Get("Content-Type")

		// 定义额外的 HTTP 响应头,比如 "Content-Disposition" 设置为附件下载,并指定文件名为 "gopher.png"
		extraHeaders := map[string]string{
			"Content-Disposition": `attachment; filename="gopher.png"`, // 提示浏览器以下载的形式处理响应内容
		}

		// 使用 c.DataFromReader 向客户端发送数据
		// 参数包括 HTTP 状态码 200 OK,文件的长度,文件的类型,数据流(即 reader),以及额外的 HTTP 响应头
		c.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders)
	})

	// 启动 Gin 服务器,监听在本地的 8080 端口
	router.Run(":8080")
}

注意:官方文档给的url有问题,手动可以访问,但程序访问不了,这里随便在百度上找了一张图片的url。
效果:
在这里插入图片描述

六、设置和获取Cookie

package main

import (
	"fmt" // 导入 fmt 包,用于格式化输出

	"github.com/gin-gonic/gin" // 导入 Gin 框架
)

func main() {
	// 创建一个默认的 Gin 路由
	router := gin.Default()

	// 定义 GET 请求的路由,当请求路径为 "/cookie" 时执行对应的处理函数
	router.GET("/cookie", func(c *gin.Context) {
		// 尝试获取名为 "gin_cookie" 的 Cookie
		cookie, err := c.Cookie("gin_cookie")

		// 如果没有找到 Cookie 或者发生错误
		if err != nil {
			// 设置默认值
			cookie = "NotSet"
			// 设置一个名为 "gin_cookie" 的 Cookie,有效期为 3600 秒
			c.SetCookie("gin_cookie", "test", 3600, "/", "localhost", false, true)
		}

		// 打印 Cookie 的值
		fmt.Printf("Cookie value: %s \n", cookie)
	})

	// 启动 HTTP 服务器,监听在默认端口 8080
	router.Run()
}

打开浏览器,访问http://localhost:8080/cookie
首次访问时,会在控制台看到输出 Cookie value: NotSet,按F12-网络,刷新页面,会看到有个名称为cookie的缓存,同时控制台的输出变为了Cookie value: test,如图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/891724.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

精心整理85道Java微服务面试题(含答案)

微服务 面试题 1、您对微服务有何了解? 2、微服务架构有哪些优势? 3。微服务有哪些特点? 4、设计微服务的最佳实践是什么? 5、微服务架构如何运作? 6、微服务架构的优缺点是什么? 7、单片&#xff0…

[Python学习日记-48] Python 中的时间处理模块—— time 与 datetime

[Python学习日记-48] Python 中的时间处理模块 简介 Python 中表示时间的几种方式 UTC 时间 time 模块 datetime 模块 简介 在平常的代码中,我们常常需要与时间打交道。在 Python 中,与时间处理有关的模块就包括:time、datetime、calend…

vue3学习之插槽slot

关于slot web组件内部的占位符,可以使用自己的标记填充这个占位符 ,具名插槽就是在slot标签上添加name属性(https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/slot) vue3官方文档:https://cn.vuejs.org/gui…

回归本真 治愈心灵——汪青《在西行的路上》

回归本真 治愈心灵——汪青《在西行的路上》 知天地、忧生存、明自我。汪青的作品《在西行的路上》主体书写的是描述自己的西北之行。本书在创作之初,作者本人用文字表现不一样的风景,传递出更多美好的瞬间。作者将应用崭新的知识混合脚步踏出的历程&am…

控制层接受用户输入-系统架构师(八十一)

1在MVC设计模式中,以下说法正确的是()。 A 控制器表示业务逻辑 B 视图接受用户输入 C 模型表示业务数据 D 一个模型只能为一个视图提供数据 解析: 控制器接受用户输入。 所以C对 2下列()设置可以隔离…

jmeter使用csv数据

背景 使用jmeter对系统进行压测。测试数据存储在了csv中,多线程压测的时候,csv中的一条数据不能多个线程同时使用,数据全部使用过后,需要终止压测。 功能点 从csv读取数据后,完成接口数据拼接。多线程依次从csv文件…

大数据-170 Elasticsearch 云服务器三节点集群搭建 测试运行

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

集师知识付费小程序:打造培训机构在线教育的金字招牌 集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统 集师线上卖课小程序

在数字化浪潮的推动下,在线教育已成为教育领域的热门话题。而在众多在线教育平台中,集师知识付费小程序凭借其独特的定位和创新的模式,成功为培训机构打造了一张闪亮的在线教育金字招牌。 集师知识付费小程序,是一个集课程展示、…

如何在Chrome、Edge、360、Firefox等浏览器查看网站SSL证书信息?

在如今的网络环境中,保障网络安全、数据安全尤其重要,市面上大部分网站都部署了SSL证书以实现HTTPS加密保护数据传输安全以及验证网站身份,确保网站安全可信。那么如何查看网站的SSL证书信息?接下来,我们将详细介绍如何…

基于STM32的自学习走迷宫智能小车设计

引言 本项目设计了一个基于STM32的自学习走迷宫智能小车。小车通过多个超声波传感器、红外传感器等,检测周围障碍物和路径。它采用简单的强化学习算法,在不断探索的过程中自我调整路径,从而最终找到迷宫的出口。系统适用于智能机器人实验、教…

数据质量差的代价是什么?

如今,许多数字企业都认为自己是数据驱动的。通过各种软件解决方案,数据无处不在,收集起来也非常方便,这使得企业能够被动地收集大量数据,并将其应用于决策制定。 然而,人们往往很容易在不考虑数据质量的情…

Light灯光组件+组件的相关操作+游戏资源的加载

Light灯光组件 Type: Directional:平行光,模仿的是太阳光 Spot:聚光灯 Area:区域光 Color: 颜色值 Mode: RealTime:实时 Mix:混合 Baked:烘焙 Intersity: 光照强度 Indirect Multiplier:光照强度乘数 Shadow Type:影子设置:…

云栖实录 | Hologres3.0全新升级:一体化实时湖仓平台

本文根据2024云栖大会实录整理而成,演讲信息如下: 演讲人: 姜伟华 | 阿里云智能集团资深技术专家、Hologres 负责人 丁 烨 | 阿里云智能集团产品专家、Hologres 产品负责人 活动: 2024 云栖大会 - 商用大数据计算与分析平台论…

OpenCV-人脸检测

文章目录 一、人脸检测流程二、关键方法三、代码示例四、注意事项 OpenCV是一个开源的计算机视觉和机器学习软件库,它提供了多种人脸检测方法,以下是对OpenCV人脸检测的详细介绍: 一、人脸检测流程 人脸检测是识别图像中人脸位置的过程&…

git--git reset

HEAD 单独一个HEAD eg:git diff HEAD 表示当前结点。 HEAD~ HEAD~只处理当前分支。 注意:master分支的上一个结点是tmp分支的所在的结点fc11b74, 79f109e才是master的第二个父节点。 HEAD~ 当前结点的父节点。 HEAD~1 当前结点的父节点。 HEAD~n 当前结点索…

kali linux 允许 root 用户登录 安装过程中不能创建 root 根用户密码 之后不能以根用户直接登录 即使是正确的管理员密码也无法登录

打开终端。 输入命令 sudo passwd root 并按回车键。 系统会提示您输入新的 UNIX 密码,输入您想要设置的密码并按回车键。 再次输入相同的密码进行确认。 如果密码设置成功,会显示 “passwd: password updated successfully”。 在登录界面&#xf…

模态与非模态的对话框

本文学习自&#xff1a; 《Qt Creato快速入门》 #include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }1. #include "widget.h" #include "ui_w…

Linux:进程控制(三)——进程程序替换

目录 一、概念 二、使用 1.单进程程序替换 2.多进程程序替换 3.exec接口 4.execle 一、概念 背景 当前进程在运行的时候&#xff0c;所执行的代码来自于自己的源文件。使用fork创建子进程后&#xff0c;子进程执行的程序中代码内容和父进程是相同的&#xff0c;如果子进…

算法: 位运算题目练习

文章目录 位运算判定字符是否唯一丢失的数字两整数之和只出现一次的数字 II消失的两个数字常见位运算总结 位运算 判定字符是否唯一 有很多解法,比如hash表,或者给字符串排个序,然后遍历… 写这道题时没注意到如果出现奇数个相同字符,此时就应该返回false了. 而不是全部放到位…

### 更新数据库时出错。原因:java.sql.SQLException: No database selected

更新数据库时出错。原因&#xff1a;java.sql.SQLException: No database selected 问题&#xff1a;原因&#xff1a;解决办法&#xff1a; 问题&#xff1a; 在基于idea环境中学习搭建mybatis框架时&#xff0c;MySQL数据库执行插入语句遇到以下异常&#xff1a; com.intel…