Go学习第十四章——Gin请求与响应
Go web框架——Gin请求与响应
- 1 响应
- 1.1 String
- 1.2 JSON(*)
- 1.3 HTML(*)
- 1.4 XML
- 1.5 文件(*)
- 2 请求
- 2.1 请求参数
- 查询参数 (Query)
- 动态参数 (Param)
- 表单参数 (PostForm)
- 原始参数 (GetRawData)
- 2.2 请求头
- 2.3 响应头
1 响应
在Gin中,我们可以使用不同的方法设置请求的响应值,包括String、JSON、HTML和XML等。
1.1 String
使用String方法返回字符串类型的响应内容。
func main() {r := gin.Default()r.GET("/users", func(c *gin.Context) {c.String(http.StatusOK, "Users")})r.Run(":8080")
}
当我们访问http://localhost:8080/users时,就能够在浏览器上看到输出了"Users"。
补充:这里的http.StatusOK,是可以修改的,可以直接写200,因为200对应就是响应成功。
1.2 JSON(*)
使用JSON方法返回JSON类型的响应内容。
这里把结构体混进来,一般都会去拿结构体的JSON内容
这段代码:c.JSON(http.StatusOK, stu)的JSON方法是自动转换的
func (c *Context) JSON(code int, obj any) {c.Render(code, render.JSON{Data: obj})
}
可以看到可以传任意对象,然后都会通过反射转换为JSON数据格式
type student struct {Name string `json:"name"`Age int `json:"age"`
}func _json(c *gin.Context) {stu := student{"张三", 18}c.JSON(http.StatusOK, stu)
}func main() {r := gin.Default()r.GET("/users", _json)r.Run(":8000")
}
当我们访问http://localhost:8080/users时,就能够在浏览器上看到JSON格式的输出内容。
进阶使用方式:
我们传JSON的时候,可以对结构体不想渲染的字段进行隐藏,例如:密码
只需要再结构体的标签里,修改成这样即可:Password string json:"-"
type user struct {Username string `json:"username,omitempty"`Password string `json:"-"`// 忽略转换为json
}func _json(c *gin.Context) {userInfo := user{"张三", "123456"}c.JSON(http.StatusOK, userInfo)
}func main() {r := gin.Default()r.GET("/users", _json)r.Run(":8000")
}
然后游览器就不会渲染出来了,并且相应的数据里也没有

ps:这里可以传结构体,也可以传Map,包括直接传JSON,都会进行渲染
1.3 HTML(*)
使用HTML方法返回HTML类型的响应内容。
先在文件夹下面创建一个templates文件夹,再创建一个index.html文件,
写上<header>你好啊, {{.username}}</header>,因为这里可以使用插值语法进行传参

写main函数的时候,注意需要告诉服务器index文件在哪,所以需要使用这个函数进行加载
func main() {r := gin.Default()r.LoadHTMLGlob("GinStudy01_HelloWord/templates/*") // 加载目录下的所有文件(全局加载)r.GET("/users", func(c *gin.Context) {c.HTML(http.StatusOK, "index.html", gin.H{"username": "张三",})})r.Run(":8000")
}
当我们访问http://localhost:8000/users时,就能够在浏览器上看到HTML格式的输出内容。

1.4 XML
使用XML方法返回XML类型的响应内容。
func main() {r := gin.Default()r.GET("/users", func(c *gin.Context) {c.XML(http.StatusOK, gin.H{"name": "Tom","age": 18,})})r.Run(":8080")
}
当我们访问http://localhost:8080/users时,就能够在浏览器上看到XML格式的输出内容。
1.5 文件(*)
将文件服务于指定的URL路径上,可以用于提供静态资源(如图片、CSS文件、JavaScript文件等)
创建一个文件夹static,然后放一个文件进去,例如:我放了一个图片,image.jpg文件
StaticFile提供的是一个单个文件的静态服务,将指定的文件服务于指定的URL路径上,使用这个方法时,只需指定文件的绝对路径和访问路径即可:
func main() {r := gin.Default()r.StaticFile("static/image.jpg", "GinStudy01_HelloWord/static/image.jpg")r.Run(":8000")
}
然后我们访问http://localhost:8000/static/image.jpg,就可以响应到对应的图片
StaticFs 提供的是一个基于http.FileSystem的静态文件服务,可以将多个静态文件目录映射到不同的访问路径下
func main() {r := gin.Default()fs := http.Dir("GinStudy01_HelloWord/static")r.StaticFS("/static", fs)r.Run(":8000")
}
然后,我们可以再static文件夹下面再放其他的文件,例如:我放了一个text.txt文件
访问:http://localhost:8000/static/text.txt

如果你想要访问图片,就直接访问http://localhost:8000/static/image.jpg即可
2 请求
2.1 请求参数
查询参数 (Query)
func _query(c *gin.Context) {// 使用queryname := c.Query("name")age := c.Query("age")// 处理查询参数c.JSON(http.StatusOK, gin.H{"name": name,"age": age,})fmt.Printf("name=%v, age=%v", name, age)
}func main() {router := gin.Default()router.GET("/query", _query)router.Run(":8080")
}
访问:http://127.0.0.1:8080/query?name=张三&age=18,就会看到结果,并且打印在Goland上面
动态参数 (Param)
func _param(c *gin.Context) {// 使用Param方法id := c.Param("id")// 处理动态参数c.JSON(http.StatusOK, gin.H{"id": id,})
}func main() {router := gin.Default()// 注意:这里动态参数是这里不同router.GET("/user/:id", _param)router.Run(":8080")
}
访问:http://127.0.0.1:8080/user/1,就能看到结果
表单参数 (PostForm)
func _postForm(c *gin.Context) {// 使用PostForm方法name := c.PostForm("name")age := c.PostForm("age")// 处理表单参数c.JSON(http.StatusOK, gin.H{"name": name,"age": age,})fmt.Printf("name=%v, age=%v", name, age)
}func main() {router := gin.Default()// 表单是POST请求router.POST("/users", _postForm)router.Run(":8080")
}
这里我使用Apifox调用接口,比较方便,用游览器比较麻烦
- 先创建一个项目,我写了一个Gin学习,不重要~
- 左边有个接口管理,在快捷请求里新建,然后使用POST,并且写上对应的url和下面选择Body,点击form-data

然后点击发送,下面就是响应的JSON数据
原始参数 (GetRawData)
func _raw(c *gin.Context) {body, _ := c.GetRawData()fmt.Println(string(body))
}func main() {router := gin.Default()router.POST("/raw", _raw)router.Run(":8080")
}
访问http://127.0.0.1:8080/raw,打印的数据如图

2.2 请求头
请求头参数获取
GetHeader,可以大小写不分,且返回切片中的第一个数据
func _header(c *gin.Context) {// 首字母大小写不区分 单词与单词之间用 - 连接// 用于获取一个请求头fmt.Println(c.GetHeader("User-Agent"))//fmt.Println(c.GetHeader("user-agent"))// Header 是一个普通的 map[string][]stringfmt.Println(c.Request.Header)// 如果是使用 Get方法或者是 .GetHeader,那么可以不用区分大小写,并且返回第一个valuefmt.Println(c.Request.Header.Get("User-Agent"))fmt.Println(c.Request.Header["User-Agent"])// 如果是用map的取值方式,请注意大小写问题fmt.Println(c.Request.Header["user-agent"])// 自定义的请求头,用Get方法也是免大小写fmt.Println(c.Request.Header.Get("Token"))fmt.Println(c.Request.Header.Get("token"))c.JSON(200, gin.H{"msg": "成功"})
}func main() {router := gin.Default()router.GET("/header", _header)router.Run(":8080")
}
打开F12,再访问:http://127.0.0.1:8080/header,通过对比看到对应的结果

2.3 响应头
设置响应头的方式
func _header(c *gin.Context) {c.Header("Token", "jhgeu%hsg845jUIF83jh")c.Header("Content-Type", "application/text; charset=utf-8")c.JSON(0, gin.H{"data": "看看响应头"})
}func main() {router := gin.Default()router.GET("/header", _header)router.Run(":8080")
}
一样使用F12,访问进行查看~

相关文章:
Go学习第十四章——Gin请求与响应
Go web框架——Gin请求与响应 1 响应1.1 String1.2 JSON(*)1.3 HTML(*)1.4 XML1.5 文件(*) 2 请求2.1 请求参数查询参数 (Query)动态参数 (Param)表单参数 (PostForm)原始参数 (GetRawData) 2.2 请求头2.3 …...
【多线程面试题十】、说一说notify()、notifyAll()的区别
文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:说一说notify()、notify…...
【Element UI】解决 el-button 禁用状态下,el-tooltip 提示不生效问题
文章目录 问题描述解决方法 问题描述 关键代码: <el-tooltipcontent"一段提示内容"placement"bottom"effect"light":disabled"count > 100" ><el-buttontype"text"class"dl-button":dis…...
C++单元测试GoogleTest和GoogleMock十分钟快速上手(gtestgmock)
C单元测试GoogleTest和GoogleMock(gtest&gmock) 环境准备 下载 git clone https://github.com/google/googletest.git # 或者 wget https://github.com/google/googletest/releases/tag/release-1.11.0安装 cd googletest cmake CMakeLists.txt make sudo make instal…...
Starknet的去中心化路线图
1. 引言 StarkWare正以2条路线在迈向去中心化: planningimplementation 以让Starknet协议 走向 去中心化proof-of-stake协议。 Starknet向以太坊发送STARK proofs来验证其状态变更。 一年前Starknet就在做去中心化规划,相关提案见: Sim…...
python基础语法(十二)
目录 标准库认识标准库使用 import 导入模块代码示例: 字符串操作剑指offer 58, 翻转单词顺序题目题目做法代码 leetcode 796, 旋转字符串题目题目做法 leetcode 2255, 统计是给定字符串前缀的字符串数目题目题目做法 代码示例: 文件查找工具 感谢各位大佬对我的支持,如果我的文…...
【开源】基于SpringBoot的农村物流配送系统的设计和实现
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理:2.2.2 位置信息管理:2.2.3 配送人员分配:2.2.4 路线规划:2.2.5 个人中心:2.2.6 退换快递处理:…...
【2024秋招】2023-9-16 贝壳后端开发一面
1 秒杀系统 1.1 如何抗住高并发 1.2 数据一致性你是怎么处理,根据场景来说明你的设计思路 1.3 你们当时系统的架构是怎么样的 秒杀表做节点隔离, 1.4 为了保证数据一致性,引入了redission的锁,你是为了抗住高并发而去为了引入…...
BI是什么?想要了解BI需要从哪些方面入手?
企业为了执行数字化战略,实行数字化转型,实现数据价值,除了需要相关数字化技术及理念、人才等,还需要借助数字化相关应用,例如商业世界中广受企业欢迎的ERP、OA、CRM等业务信息系统,以及上升势头非常迅猛的…...
软件测试---等价类划分(功能测试)
能对穷举场景设计测试点-----等价类划分 等价类划分 说明:在所有测试数据中,具有某种共同特征的数据集合进行划分分类: 1)有效等价类 2)无效等价类步骤:1)明确需求 2)确定有效和无…...
javascript原生态xhr上传多个图片,可预览和修改上传图片为固定尺寸比例,防恶意代码,加后端php处理图片
//前端上传文件 <!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml" lang"UTF-8"></html> <html><head><meta http-equiv"Content-Type" content"text/html;charsetUTF-8;"/><title…...
【Java】Map集合中常用方法
Map集合的常用方法 方法名称作用V put(Key k,V value)添加元素V remove(K key, V value)根据键值删除对应的值void clear()清除所有键值元素boolean containsKey(Object key)判断集合中是否包含指定的键boolean containsValue(Object value)判断集合中是否包含指定的值boolean …...
方太描画未来厨房的模样
作者 | 辰纹 来源 | 洞见新研社 不知不觉中,iPhone已经更新到15代了,家里的电视变成了越来越轻薄的液晶屏,过去被称为“老三样”的富康,捷达、桑塔纳,如今也被以特斯拉为代表的新能源智能汽车们所取代…… 类似以上的…...
ELASTICO-A Secure Sharding Protocol For Open Blockchains
INTRO 在中本聪共识中,通过POW机制来公平的选举leader,不仅非常消耗power,并且拓展性也不好。现在比特币中是7 TPS,和其他的支付系统相比效率相差甚远。 当前的许多拜占庭共识协议,并不支持在一个开放的环境中使用&a…...
【数据结构】Map和Set
⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈数据结构 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 Map、Set 1. 搜索树1.1 概念1.2 性能…...
Python Flask
Python Flask是一个轻量级的web开发框架,用于快速地构建web应用程序。以下是Python Flask的基本使用步骤: 安装Flask:使用pip安装Flask包。在命令行中输入以下命令: pip install flask创建Flask对象:在Python文件中&am…...
时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测
时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Python实现ARIM…...
Redis快速上手篇八(redission完善分布式锁)
Redisson Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。简单说就是redis在分布式系统上工…...
Dataset文件下载以及使用,以nuswide为例
文章目录 文件夹结构如何使用继承torch.utils.data.Dataset构建新的class构建新的Dataloader 数据集要求以文章 multi-label learning from single positive label为例; 文件夹结构 我是这么放置的,其中含有obs的文件是通过运行文件夹preproc下的genera…...
ZYNQ连载02-开发环境
ZYNQ连载02-开发环境 1. 官方文档 ZYNQ开发使用的软件为Vivado/Vitis/PetaLinux,软件体积比较大,硬盘保留100G以上的空间,赛灵思提供详细的文档,链接如下: ZYNQ文档 2. Vivido和Vitis安装 赛灵思统一安装程序 3. PetaLinux安装…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
