Gin框架操作指南02:JSON渲染
官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/
注:本教程采用工作区机制,所以一个项目下载了Gin框架,其余项目就无需重复下载,想了解的读者可阅读第一节:Gin操作指南:开山篇。
本节演示JSON渲染,包括AsciiJSON JSONP PureJSON SecureJSON XML-JSON-YAML-ProtoBuf渲染。在开始之前,我们需要在”01数据渲染“目录下打开命令行,执行如下命令来创建子目录:
mkdir AsciiJSON JSONP PureJSON SecureJSON XML-JSON-YAML-ProtoBuf渲染
目录
- 一、AsciiJSON
- 二、JSONP
- 三、PureJSON
- 四、SecureJSON
- 五、XML-JSON-YAML-ProtoBuf渲染
一、AsciiJSON
在”AsciiJSON“根目录下创建main.go,填充代码:
package mainimport ("net/http" // 用于提供 HTTP 标准响应状态码,如 http.StatusOK"github.com/gin-gonic/gin" // 引入 Gin Web 框架的包
)func main() {// 创建一个默认的 Gin 路由器,带有默认的日志记录和恢复中间件(可自动记录每个请求并处理崩溃恢复)r := gin.Default()// 定义一个 GET 请求的路由 `/someJSON`// 当客户端发起对 "/someJSON" 的 GET 请求时,执行回调函数处理请求r.GET("/someJSON", func(c *gin.Context) {// 准备一个包含两对键值对的数据结构,用于返回 JSON 响应data := map[string]interface{}{"lang": "GO语言", // 第一个键值对,lang 对应的是 "GO语言""tag": "<br>", // 第二个键值对,tag 对应的是 HTML 标签 "<br>"}// 使用 AsciiJSON 方法生成 ASCII-only 的 JSON 响应// 非 ASCII 字符会被转义,例如 "GO语言" 中的 "语言" 会被转义为 Unicode 格式:\u8bed\u8a00// 同样的,"<br>" 会被转义为 \u003cbr\u003e// 输出结果将会是: {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"}c.AsciiJSON(http.StatusOK, data)})// 启动 HTTP 服务,监听 0.0.0.0:8080 地址// 这个地址意味着服务将在本地所有可用的 IP 地址上监听请求// 默认的端口是 8080,如果需要使用不同的端口,修改 ":8080" 为其他值即可r.Run(":8080")
}
gin.Context
: gin.Context 是 Gin 框架中用于处理请求和响应的核心数据结构。通过它,开发者可以读取请求参数、设置响应数据,以及管理 HTTP 状态码等。
效果:
二、JSONP
在”JSONP“根目录下创建main.go,填充代码:
package mainimport ("net/http" // 导入 http 包,用于定义 HTTP 状态码"github.com/gin-gonic/gin" // 引入 Gin Web 框架
)func main() {// 创建一个默认的 Gin 路由引擎实例,默认启用 Logger 和 Recovery 中间件r := gin.Default()// 定义一个 GET 路由,当用户访问 /JSONP 时触发该处理函数r.GET("/JSONP", func(c *gin.Context) {// 定义一个 map 类型的变量 data,存储要返回给客户端的 JSON 数据// 键为字符串类型,值为 interface{},可以存储任意类型的数据data := map[string]interface{}{"foo": "bar", // "foo" 字段的值为 "bar"}// 如果用户访问的 URL 包含查询参数 callback,例如 /JSONP?callback=x// Gin 会将 JSON 数据封装到指定的回调函数中// 输出格式将会是 x({"foo":"bar"}), 其中 x 是用户提供的回调函数名c.JSONP(http.StatusOK, data)})// 启动 HTTP 服务器并监听在 0.0.0.0:8080 上// 0.0.0.0 表示服务器监听所有网络接口,端口为 8080r.Run(":8080")
}
效果:
三、PureJSON
在”PureJSON“根目录下创建main.go,填充代码:
package mainimport ("github.com/gin-gonic/gin" // 引入 Gin Web 框架
)func main() {// 创建一个默认的 Gin 路由引擎实例,启用 Logger 和 Recovery 中间件r := gin.Default()// 定义一个 GET 路由,当用户访问 /json 时执行该处理函数// 该处理函数使用标准的 c.JSON 方法输出 JSON 数据// 该方法会将 HTML 标签转义为 Unicode 码点r.GET("/json", func(c *gin.Context) {// 使用 c.JSON 生成 JSON 响应,自动将特殊字符转义// 例如 <b>Hello, world!</b> 将被转义为 "\u003cb\u003eHello, world!\u003c/b\u003e"c.JSON(200, gin.H{"html": "<b>Hello, world!</b>", // 这个字符串会被自动转义})})// 定义另一个 GET 路由,当用户访问 /purejson 时执行该处理函数// 该处理函数使用 PureJSON 方法,直接输出原始字符,不进行转义r.GET("/purejson", func(c *gin.Context) {// 使用 c.PureJSON 生成不转义的 JSON 响应// 例如 <b>Hello, world!</b> 将保持原样输出,不会被转义c.PureJSON(200, gin.H{"html": "<b>Hello, world!</b>", // 这个字符串将以原始形式返回,不进行转义})})// 启动 HTTP 服务器并监听 0.0.0.0:8080,表示接受所有网络接口上的请求r.Run(":8080")
}
效果:
四、SecureJSON
在”SecureJSON“根目录下创建main.go,填充代码:
package mainimport ("net/http" // 导入 HTTP 标准库,用于处理 HTTP 请求和响应"github.com/gin-gonic/gin" // 引入 Gin Web 框架
)func main() {// 创建一个默认的 Gin 路由引擎实例,启用 Logger 和 Recovery 中间件r := gin.Default()// 你也可以自定义 SecureJSON 的前缀// 通过 r.SecureJsonPrefix(")]}',\n") 可以为返回的 JSON 添加自定义前缀// 默认情况下,Gin 会添加 "while(1);" 作为前缀// r.SecureJsonPrefix(")]}',\n") // 这里注释掉了自定义前缀的设置// 定义一个 GET 路由,当用户访问 /someJSON 时执行该处理函数r.GET("/someJSON", func(c *gin.Context) {// 定义一个包含名字的字符串数组names := []string{"lena", "austin", "foo"}// 使用 c.SecureJSON 返回数组数据,并在响应中添加防止 JSON 劫持的前缀// 输出的响应将会是:while(1);["lena","austin","foo"]// "while(1);" 是默认的前缀,用于阻止恶意脚本解析此 JSON 数据c.SecureJSON(http.StatusOK, names)})// 启动 HTTP 服务器并监听 0.0.0.0:8080,表示接受所有网络接口上的请求r.Run(":8080")
}
效果:
五、XML-JSON-YAML-ProtoBuf渲染
在”XML-JSON-YAML-ProtoBuf渲染“根目录下创建main.go,填充代码,效果和之前没有本质区别,故省略。
package mainimport ("net/http" // 标准库的 net/http 包,用于处理 HTTP 请求和响应"github.com/gin-gonic/gin" // 引入 Gin Web 框架
)func main() {// 创建一个默认的 Gin 路由引擎实例,启用 Logger 和 Recovery 中间件r := gin.Default()// 定义一个 GET 路由,当用户访问 /someJSON 时,返回 JSON 格式的数据r.GET("/someJSON", func(c *gin.Context) {// 使用 gin.H,这是 Gin 框架提供的 map[string]interface{} 的快捷方式// 返回一个 JSON 对象,包含两个键值对:message 和 statusc.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})})// 定义一个 GET 路由,返回结构化的 JSON 数据r.GET("/moreJSON", func(c *gin.Context) {// 定义一个结构体来包含要返回的数据var msg struct {Name string `json:"user"` // 使用 `json` 标签指定 JSON 字段名为 "user"Message string // 没有标签时,字段名按原样使用Number int}// 为结构体字段赋值msg.Name = "Lena"msg.Message = "hey"msg.Number = 123// 返回结构化的 JSON 数据,Gin 会自动将结构体序列化为 JSON// 输出将是 {"user": "Lena", "Message": "hey", "Number": 123}c.JSON(http.StatusOK, msg)})// 定义一个 GET 路由,返回 XML 格式的数据r.GET("/someXML", func(c *gin.Context) {// 使用 gin.H 方式返回 XML 数据// 输出格式类似于:<map><message>hey</message><status>200</status></map>c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})})// 定义一个 GET 路由,返回 YAML 格式的数据r.GET("/someYAML", func(c *gin.Context) {// 使用 gin.H 返回 YAML 格式的数据// 输出将是:message: hey\nstatus: 200\nc.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})})// 定义一个 GET 路由,返回 Protobuf 序列化后的数据/*如果你要在 Gin 项目中使用 Protobuf,你需要:安装 Protocol Buffers 编译器 protoc。安装 protoc-gen-go 插件:bash复制代码go install google.golang.org/protobuf/cmd/protoc-gen-go@latest定义 .proto 文件,使用 protoc 工具生成 Go 代码。在 Gin 中使用 c.ProtoBuf 来发送序列化的 Protobuf 响应。*/// r.GET("/someProtoBuf", func(c *gin.Context) {// // 构造 Protobuf 数据// reps := []int64{int64(1), int64(2)} // 定义一个 int64 类型的切片// label := "test" // 定义一个标签// // 使用 protoexample.Test 结构体,这是 Protobuf 生成的结构// data := &protoexample.Test{// Label: &label, // 设置 Label 字段// Reps: reps, // 设置 Reps 字段// }// // 使用 c.ProtoBuf 返回 Protobuf 序列化后的数据,响应类型为二进制// // 输出的数据是经过 protoexample.Test 定义的 Protobuf 格式// c.ProtoBuf(http.StatusOK, data)// })// 启动 HTTP 服务器并监听 0.0.0.0:8080,表示接受所有网络接口上的请求r.Run(":8080")
}
相关文章:

Gin框架操作指南02:JSON渲染
官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/ 注:本教程采用工作区机制,所以一个项目下载了Gin框架,其余项目就无需重复下载,想了解的读者可阅读第一节:Gin操作指南&#…...
【随手记】MySQL单表访问方法
在MySQL查询优化器中,单表访问方法(Access Method)指的是查询时数据库如何从一个表中访问所需的数据。不同的访问方法适用于不同的查询场景,主要包括 const、ref、ref_or_null、range、index 和 all。这些方法从效率上依次递减&am…...
机器学习:情感分析的原理、应用场景及优缺点介绍
一、情感分析算法概述 情感分析是自然语言处理中的一个重要任务,主要用于判断文本中所包含的情感倾向,如正面、负面或中性。 二、基于词典的情感分析算法 原理 词典构建:首先需要构建一个情感词典。这个词典包含了一系列带有情感倾向的词汇…...

基于SSM的医院药品管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

特征融合篇 | YOLOv10 引入动态上采样模块 | 超过了其他上采样器
本改进已集成到YOLOv8-Magic 框架 论文名称:《Learning to Upsample by Learning to Sample》 论文地址:https://arxiv.org/abs/2308.15085 代码地址:https://github.com/tiny-smart/dysample 我们提出了 DySample,一种超轻量级且有效的动态上采样器。尽管最近基于内核的…...

【Linux系列】写入文本到文件
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【踩坑随笔】Tensorflow-GPU训练踩坑
一个无语的坑,4060单卡训练,8G内存本来就不够,还没开始训练就已经爆内存了,但是居然正常跑完了训练,然后一推理发现结果就是一坨。。。往回翻日志才发现原来中间有异常。 首先解决第一个问题:Could not lo…...

【云岚到家】-day07-4-实战项目-优惠券活动-项目准备
【云岚到家-即刻体检】-day07-4-实战项目-优惠券活动-活动管理 1 模块需求分析1.1 业务流程1.2 界面原型1.3 业务模块 2 模块设计2.1 数据流2.2 表结构设计2.2.1 优惠券活动表设计2.2.2 优惠券表设计2.2.3 优惠券核销表2.2.4 优惠券退回表 2.3 创建数据库2.4 创建工程 1 模块需…...
axios的使用
在 Vue 项目中,封装 Axios 并实现加密、重复请求优化、请求取消、页面切换时取消未完成的请求、以及区分上传和下载操作是非常常见的需求。下面将逐一讲解这些需求的实现方式。 1. Axios 的基本封装 首先,我们可以将 Axios 封装到一个服务层中…...
Ubuntu 使用命令克隆和恢复SD卡
因为平常我需要做很多张开发板的出货卡,测试卡,那么我需要将备份下来文件,方便后续管理,这里时候需要用到Ubuntu上面的命令来克隆镜像和恢复镜像到SD卡上 先查询自己的SD卡是在sdx,以我的为例子,为sdb 备…...

Java 小游戏《超级马里奥》
文章目录 一、效果展示二、代码编写1. 素材准备2. 创建窗口类3. 创建常量类4. 创建动作类5. 创建关卡类6. 创建障碍物类7. 创建马里奥类8. 编写程序入口 一、效果展示 二、代码编写 1. 素材准备 首先创建一个基本的 java 项目,并将本游戏需要用到的图片素材 image…...
go语言defer详解
什么是defer?为什么需要defer?怎样合理使用defer?defer进阶 defer的底层原理是什么?利用defer原理defer命令的拆解defer语句的参数闭包是什么?defer配合recover后记参考资料 什么是defer? defer是Go语言提供的一种用…...

【C语言】循环中断break
在循环使用过程中,可能遇到某些情况需要终止循环。比如按座位查找一位学生,循环查找,找到时可以直接停止。后续的循环将不再执行。 break;只跳出一层循环 例子中的素数判断,查找到根号n停止:一个合数等于两个数的乘积…...

centos ping能通但是wget超时-解决
问题截图: 域名解析地址为IPV6地址,建议您调整IPV4优先级之后,再尝试访问,请参考Linux系统IPv4/IPv6双栈接入优先使用IPv4设置:移动云帮助中心 实操截图:...

SDIO - DWC MSHC 电压切换和频率切换
背景 我们的sdio访问sd card过去一直跑在低频上,HS50M。前段时间给eMMc添加了HS200模式,eMMc的总线模式定义是这样的: 可以看到1.8V的IO 电压可以支持所有模式,我们过去的芯片,由硬件部门放到evb上,其IO …...

EI-CLIP 深度理解 PPT
系列文章目录 文章目录 系列文章目录 在电子商务产品的跨模态检索中,电子商务图像和电子商务语言都有许多独特的特点。如图所示,一个电子商务产品图片通常只包含一个简单的场景,有一个或两个前景物体和一个普通的背景。同时,电子商…...
leetcode力扣刷题系列——【最小元素和最大元素的最小平均值】
题目 你有一个初始为空的浮点数数组 averages。另给你一个包含 n 个整数的数组 nums,其中 n 为偶数。 你需要重复以下步骤 n / 2 次: 从 nums 中移除 最小 的元素 minElement 和 最大 的元素 maxElement。 将 (minElement maxElement) / 2 加入到 aver…...

【线性回归分析】:基于实验数据的模型构建与可视化
目录 线性回归分析:基于实验数据的模型构建与可视化 1. 数据准备 2. 构建线性回归模型 3. 可视化 数据分析的核心 构建预测模型 应用场景 预测模型中的挑战 结论 线性回归分析:基于实验数据的模型构建与可视化 在数据分析领域,线性…...

CountUp.js 实现数字增长动画 Vue
效果: 官网介绍 1. 安装 npm install --save countup.js2. 基本使用 // template <span ref"number1Ref"></span>// script const number1Ref ref<HTMLElement>() onMounted(() > {new CountUp(number1Ref.value!, 9999999).sta…...

设计模式大全
1. 策略模式 什么是策略模式? 策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换。策略模式使得算法可以独立于使用它的客户端而变化。通过使用策略…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...