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

news2024/11/29 1:39:59

官方文档地址(中文):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,如图
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运行Springboot + Vue 项目

前言:很多小白拿到java SpringBoot Vue前后端分离的项目却不知道怎么运行起来,这里博主就带领小白们一起将项目运行起来吧! 一、环境准备 java后端软件:Idea、jdk、mysql、Navicat(可用其他代替,如dbea…

获取vue实例

需要注意的是,无论通过哪种方式获取元素,如果元素为 vue 组件,则需要在子组件中使用 defineExpose 进行暴露。 在父组件中,我们静态绑定 childRef: 在子组件中,我们需要通过defineExpose函数,手…

05 奶牛与书架

题目&#xff1a; 贪心&#xff1a; #include<bits/stdc.h> using namespace std; #define M 100005 int a[M];bool cmp(int n1,int n2) {return n1>n2; }int main() {int N,B;cin>>N>>B;for(int i1;i<N;i){cin>>a[i];}sort(a1,aN1,cmp);int su…

昆虫分类与检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

昆虫分类与检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

Electron-(二)桌面应用的启动动画创建

一、概述 在很多桌面应用中都会有启动画面的显示。启动画面可以解决在启动时耗时较长&#xff0c;将每一步反馈给用户。另外一方面解决启动过程中的环境检查及检查结果的反馈。 在当今的桌面应用领域&#xff0c;启动动画已成为提升用户体验的重要组成部分。它不仅仅是一个简单…

使用 Spring 框架构建 MVC 应用程序:初学者教程

Spring Framework 是一个功能强大、功能丰富且设计精良的 Java 平台框架。它提供了一系列编程和配置模型&#xff0c;旨在简化和精简 Java 中健壮且可测试的应用程序的开发过程。 人们常说 Java 太复杂了&#xff0c;构建简单的应用程序需要很长时间。尽管如此&#xff0c;Jav…

Leetcode——数组:滑动窗口209.长度最小的子数组

题目 题解 当需要查找数组中某些连续的数字之和&#xff0c;适合使用滑动窗口 先将滑动窗口的长度设置为0&#xff0c;先将左侧固定&#xff0c;右边界向右移动&#xff0c;同时计算需要找的条件&#xff0c;直到找到可行解为止 当找到可行解后&#xff0c;对其进行优化&…

BUU刷题-Pwn-jarvisoj_typo(ARM符号表恢复技术,Rizzo,FLIRT)

解题所涉知识点&#xff1a; 泄露或修改内存数据&#xff1a; 堆地址&#xff1a;栈地址&#xff1a;libc地址&#xff1a;BSS段地址&#xff1a; 劫持程序执行流程&#xff1a;ARM_ROP 获得shell或flag&#xff1a;调用程序中的system 题目类型&#xff1a; ARM_Pwn arm32 …

Android Framework AMS(04)startActivity分析-1(am启动到ActivityThread启动)

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要解读AMS通过startActivity启动Activity的整个流程的第一阶段&#xff1a;从am启动到ActivityThread启动。 第二阶段文章链接为&#xf…

如何破解 AI 聊天机器人让它们吐露秘密!窥探 AI 系统指令的 10 种技巧

​ 有时&#xff0c;为了确保 AI 的安全性和透明性&#xff0c;用户需要自己动手&#xff0c;揭开系统指令的面纱。 如果人工智能现在已经成为生活中的事实&#xff0c;并影响着我们的福祉&#xff0c;人们理应知道它的运作原理。 对一些人来说&#xff0c;科幻电影中的经典…

【C++进阶】封装红黑树实现map和set

【C进阶】封装红黑树实现map和set &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 源码及框架分析 2. 模拟实现map和set 2.1 实现出复用红黑树的框架&#xff0c;并支持insert…

《TH-OCR:强大的光学字符识别技术》

在当今数字化的时代&#xff0c;高效准确地将纸质文档、图片中的文字转换为可编辑的电子文本至关重要。而 TH-OCR&#xff08;清华 OCR&#xff09;就是一款在光学字符识别领域表现卓越的软件。 一、TH-OCR 的简介 TH-OCR 是由清华大学电子工程系智能图文信息处理研究室研发的光…

Loss:CornerNet: Detecting Objects as Paired Keypoints

目录 3 CornerNet(角点网络)3.1 概述3.2 检测角点3.2.1 检测角点概述3.2.2 训练中的惩罚调整3.2.3 焦点损失变体计算3.2.4 下采样与偏移量预测3.3 角点分组3.3.1 角点分组的需求与启发3.3.2 关联嵌入在角点分组中的应用3.3.3 “拉近”损失和“推开”损失计算3.4 角点池化3.4.…

echarts饼图前后端代码SpringCloud+Vue3

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

【网络通信基础与实践第五讲】由浅入深了解路由器的结构设计

我们要实现网络互连&#xff0c;需要一个设备&#xff0c;这个设备可以实现将数据从一个端口转发到另外一个端口&#xff0c;从而实现信息的交换&#xff0c;这个设备就是路由器。 知道了路由器的功能需求&#xff0c;我们就要设计对应的结构来满足这样的需求从而实现相应的功…

【数据结构笔记】图Graph

目录 物理结构 邻接矩阵 矩阵压缩 关联矩阵 邻接表 邻接多重表 图搜索 广度优先搜索BFS 边分类 连通域分解 无权最短路径 深度优先搜索DFS 边分类 双连通分量 优先级优先搜索PFS 单源最短路径问题 Dijkstra算法 Bellman-Ford算法 所有结点对最短路径问题 Fl…

Python语言核心12个必知语法细节

1. 变量和数据类型 Python是动态类型的&#xff0c;变量不需要声明类型。 python复制代码 a 10 # 整数 b 3.14 # 浮点数 c "Hello" # 字符串 d [1, 2, 3] # 列表 2. 条件语句 使用if, elif, else进行条件判断。 python复制代码 x 10 if x > 5: print(&q…

获取首日涨停封盘后第二次交易日上涨/下跌的概率

有许多投资者喜欢在股票涨停封盘后&#xff0c;跟进买入。普通股民会认为一个能在今日涨停封盘的股票&#xff0c;证明其上市公司正有十分重大的利好信息&#xff0c;只需要跟进购买便可以获取短期利益。 我们用数据来看一下在当日涨停封盘后&#xff0c;第二次交易日是上涨还…

JavaWeb——Vue:打包部署(Nginx、目录介绍、部署及启动、访问 )

目录 打包 部署 Nginx 目录介绍 部署及启动 访问 前端 Vue 项目的最后一步是打包部署。在当前前后端分离的开发模式中&#xff0c;前端开发人员开发前端代码&#xff0c;后端开发人员开发后端代码。最终要将开发及测试完毕的前端 Vue 代码和后端代码分开部署在对应的服…

pulsar mq 单体验证demo, docker启动pulsar mq验证生产者消费者命令

1. 进入pulsar # 进入容器 docker exec -it xxx /bin/bash # 进入脚本 cd bin 2. 消费命令&#xff1a; ./pulsar-client consume my-topic -s "fist-subscription" 3. 新增一个创建&#xff0c;重复上述操作&#xff0c;进入bin文件夹&#xff0c;输入生产者命令…