当前位置: 首页 > news >正文

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")
}

然后游览器就不会渲染出来了,并且相应的数据里也没有

image-20231027225356894

ps:这里可以传结构体,也可以传Map,包括直接传JSON,都会进行渲染

1.3 HTML(*)

使用HTML方法返回HTML类型的响应内容。

先在文件夹下面创建一个templates文件夹,再创建一个index.html文件,

写上<header>你好啊, {{.username}}</header>,因为这里可以使用插值语法进行传参

image-20231027230941273

写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格式的输出内容。

image-20231027231642921

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

image-20231027234019639

如果你想要访问图片,就直接访问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调用接口,比较方便,用游览器比较麻烦

  1. 先创建一个项目,我写了一个Gin学习,不重要~
  2. 左边有个接口管理,在快捷请求里新建,然后使用POST,并且写上对应的url和下面选择Body,点击form-data

image-20231028152758905

然后点击发送,下面就是响应的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,打印的数据如图

image-20231028155626168

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,通过对比看到对应的结果

image-20231028162412900

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,访问进行查看~

image-20231028162627447

相关文章:

Go学习第十四章——Gin请求与响应

Go web框架——Gin请求与响应 1 响应1.1 String1.2 JSON&#xff08;*&#xff09;1.3 HTML&#xff08;*&#xff09;1.4 XML1.5 文件&#xff08;*&#xff09; 2 请求2.1 请求参数查询参数 (Query)动态参数 (Param)表单参数 (PostForm)原始参数 (GetRawData) 2.2 请求头2.3 …...

【多线程面试题十】、说一说notify()、notifyAll()的区别

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说一说notify()、notify…...

【Element UI】解决 el-button 禁用状态下,el-tooltip 提示不生效问题

文章目录 问题描述解决方法 问题描述 关键代码&#xff1a; <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条路线在迈向去中心化&#xff1a; planningimplementation 以让Starknet协议 走向 去中心化proof-of-stake协议。 Starknet向以太坊发送STARK proofs来验证其状态变更。 一年前Starknet就在做去中心化规划&#xff0c;相关提案见&#xff1a; Sim…...

python基础语法(十二)

目录 标准库认识标准库使用 import 导入模块代码示例: 字符串操作剑指offer 58, 翻转单词顺序题目题目做法代码 leetcode 796, 旋转字符串题目题目做法 leetcode 2255, 统计是给定字符串前缀的字符串数目题目题目做法 代码示例: 文件查找工具 感谢各位大佬对我的支持,如果我的文…...

【开源】基于SpringBoot的农村物流配送系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理&#xff1a;2.2.2 位置信息管理&#xff1a;2.2.3 配送人员分配&#xff1a;2.2.4 路线规划&#xff1a;2.2.5 个人中心&#xff1a;2.2.6 退换快递处理&#xff1a;…...

【2024秋招】2023-9-16 贝壳后端开发一面

1 秒杀系统 1.1 如何抗住高并发 1.2 数据一致性你是怎么处理&#xff0c;根据场景来说明你的设计思路 1.3 你们当时系统的架构是怎么样的 秒杀表做节点隔离&#xff0c; 1.4 为了保证数据一致性&#xff0c;引入了redission的锁&#xff0c;你是为了抗住高并发而去为了引入…...

BI是什么?想要了解BI需要从哪些方面入手?

企业为了执行数字化战略&#xff0c;实行数字化转型&#xff0c;实现数据价值&#xff0c;除了需要相关数字化技术及理念、人才等&#xff0c;还需要借助数字化相关应用&#xff0c;例如商业世界中广受企业欢迎的ERP、OA、CRM等业务信息系统&#xff0c;以及上升势头非常迅猛的…...

软件测试---等价类划分(功能测试)

能对穷举场景设计测试点-----等价类划分 等价类划分 说明&#xff1a;在所有测试数据中&#xff0c;具有某种共同特征的数据集合进行划分分类&#xff1a; 1&#xff09;有效等价类 2&#xff09;无效等价类步骤&#xff1a;1&#xff09;明确需求 2&#xff09;确定有效和无…...

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 …...

方太描画未来厨房的模样

作者 | 辰纹 来源 | 洞见新研社 不知不觉中&#xff0c;iPhone已经更新到15代了&#xff0c;家里的电视变成了越来越轻薄的液晶屏&#xff0c;过去被称为“老三样”的富康&#xff0c;捷达、桑塔纳&#xff0c;如今也被以特斯拉为代表的新能源智能汽车们所取代…… 类似以上的…...

ELASTICO-A Secure Sharding Protocol For Open Blockchains

INTRO 在中本聪共识中&#xff0c;通过POW机制来公平的选举leader&#xff0c;不仅非常消耗power&#xff0c;并且拓展性也不好。现在比特币中是7 TPS&#xff0c;和其他的支付系统相比效率相差甚远。 当前的许多拜占庭共识协议&#xff0c;并不支持在一个开放的环境中使用&a…...

【数据结构】Map和Set

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; Map、Set 1. 搜索树1.1 概念1.2 性能…...

Python Flask

Python Flask是一个轻量级的web开发框架&#xff0c;用于快速地构建web应用程序。以下是Python Flask的基本使用步骤&#xff1a; 安装Flask&#xff1a;使用pip安装Flask包。在命令行中输入以下命令&#xff1a; pip install flask创建Flask对象&#xff1a;在Python文件中&am…...

时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测

时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Python实现ARIM…...

Redis快速上手篇八(redission完善分布式锁)

Redisson Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务&#xff0c;其中就包含了各种分布式锁的实现。简单说就是redis在分布式系统上工…...

Dataset文件下载以及使用,以nuswide为例

文章目录 文件夹结构如何使用继承torch.utils.data.Dataset构建新的class构建新的Dataloader 数据集要求以文章 multi-label learning from single positive label为例&#xff1b; 文件夹结构 我是这么放置的&#xff0c;其中含有obs的文件是通过运行文件夹preproc下的genera…...

ZYNQ连载02-开发环境

ZYNQ连载02-开发环境 1. 官方文档 ZYNQ开发使用的软件为Vivado/Vitis/PetaLinux,软件体积比较大&#xff0c;硬盘保留100G以上的空间&#xff0c;赛灵思提供详细的文档&#xff0c;链接如下&#xff1a; ZYNQ文档 2. Vivido和Vitis安装 赛灵思统一安装程序 3. PetaLinux安装…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...