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安装…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...