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

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渲染

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…...

【随手记】MySQL单表访问方法

在MySQL查询优化器中&#xff0c;单表访问方法&#xff08;Access Method&#xff09;指的是查询时数据库如何从一个表中访问所需的数据。不同的访问方法适用于不同的查询场景&#xff0c;主要包括 const、ref、ref_or_null、range、index 和 all。这些方法从效率上依次递减&am…...

机器学习:情感分析的原理、应用场景及优缺点介绍

一、情感分析算法概述 情感分析是自然语言处理中的一个重要任务&#xff0c;主要用于判断文本中所包含的情感倾向&#xff0c;如正面、负面或中性。 二、基于词典的情感分析算法 原理 词典构建&#xff1a;首先需要构建一个情感词典。这个词典包含了一系列带有情感倾向的词汇…...

基于SSM的医院药品管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

特征融合篇 | YOLOv10 引入动态上采样模块 | 超过了其他上采样器

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

【Linux系列】写入文本到文件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【踩坑随笔】Tensorflow-GPU训练踩坑

一个无语的坑&#xff0c;4060单卡训练&#xff0c;8G内存本来就不够&#xff0c;还没开始训练就已经爆内存了&#xff0c;但是居然正常跑完了训练&#xff0c;然后一推理发现结果就是一坨。。。往回翻日志才发现原来中间有异常。 首先解决第一个问题&#xff1a;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 项目中&#xff0c;封装 Axios 并实现加密、重复请求优化、请求取消、页面切换时取消未完成的请求、以及区分上传和下载操作是非常常见的需求。下面将逐一讲解这些需求的实现方式。 1. Axios 的基本封装 首先&#xff0c;我们可以将 Axios 封装到一个服务层中&#xf…...

Ubuntu 使用命令克隆和恢复SD卡

因为平常我需要做很多张开发板的出货卡&#xff0c;测试卡&#xff0c;那么我需要将备份下来文件&#xff0c;方便后续管理&#xff0c;这里时候需要用到Ubuntu上面的命令来克隆镜像和恢复镜像到SD卡上 先查询自己的SD卡是在sdx&#xff0c;以我的为例子&#xff0c;为sdb 备…...

Java 小游戏《超级马里奥》

文章目录 一、效果展示二、代码编写1. 素材准备2. 创建窗口类3. 创建常量类4. 创建动作类5. 创建关卡类6. 创建障碍物类7. 创建马里奥类8. 编写程序入口 一、效果展示 二、代码编写 1. 素材准备 首先创建一个基本的 java 项目&#xff0c;并将本游戏需要用到的图片素材 image…...

go语言defer详解

什么是defer&#xff1f;为什么需要defer&#xff1f;怎样合理使用defer?defer进阶 defer的底层原理是什么&#xff1f;利用defer原理defer命令的拆解defer语句的参数闭包是什么&#xff1f;defer配合recover后记参考资料 什么是defer&#xff1f; defer是Go语言提供的一种用…...

【C语言】循环中断break

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

centos ping能通但是wget超时-解决

问题截图&#xff1a; 域名解析地址为IPV6地址&#xff0c;建议您调整IPV4优先级之后&#xff0c;再尝试访问&#xff0c;请参考Linux系统IPv4/IPv6双栈接入优先使用IPv4设置&#xff1a;移动云帮助中心 实操截图&#xff1a;...

SDIO - DWC MSHC 电压切换和频率切换

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

EI-CLIP 深度理解 PPT

系列文章目录 文章目录 系列文章目录 在电子商务产品的跨模态检索中&#xff0c;电子商务图像和电子商务语言都有许多独特的特点。如图所示&#xff0c;一个电子商务产品图片通常只包含一个简单的场景&#xff0c;有一个或两个前景物体和一个普通的背景。同时&#xff0c;电子商…...

leetcode力扣刷题系列——【最小元素和最大元素的最小平均值】

题目 你有一个初始为空的浮点数数组 averages。另给你一个包含 n 个整数的数组 nums&#xff0c;其中 n 为偶数。 你需要重复以下步骤 n / 2 次&#xff1a; 从 nums 中移除 最小 的元素 minElement 和 最大 的元素 maxElement。 将 (minElement maxElement) / 2 加入到 aver…...

【线性回归分析】:基于实验数据的模型构建与可视化

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

CountUp.js 实现数字增长动画 Vue

效果&#xff1a; 官网介绍 1. 安装 npm install --save countup.js2. 基本使用 // template <span ref"number1Ref"></span>// script const number1Ref ref<HTMLElement>() onMounted(() > {new CountUp(number1Ref.value!, 9999999).sta…...

设计模式大全

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

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...