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 main

import (
	"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 main

import (
	"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 表示服务器监听所有网络接口,端口为 8080
	r.Run(":8080")
}

效果:
在这里插入图片描述

三、PureJSON

在”PureJSON“根目录下创建main.go,填充代码:

package main

import (
	"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 main

import (
	"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 main

import (
	"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 和 status
		c.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\n
		c.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")
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/895818.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qt creator 开发环境的安装

1.找官网 官网地址&#xff1a;Installation | Qt Creator Documentation 点 Parent Directory 继续点 Parent Directory 点 archive/ 2.下载在线安装器 点 online_ainstallers 选择在线安装器版本 选择对应版本后进入下载列表&#xff0c;根据自己的系统选择下载。 下载后…

DreamFace 4.7.1 | 图片说话,数字人

DreamFace是一款可以把静态图片变成动态视频的软件&#xff0c;操作简单&#xff0c;内置多种模板可供选择。此外&#xff0c;还支持将图片变得更清晰或者转换成卡通风格等功能&#xff0c;非常适合喜欢创意视频制作的用户。通过安装软件后&#xff0c;根据提示选择需要转换的静…

c++ pdf文件提取txt文本示例

最近抽空采用之前封装的接口将pdf文件提取出txt文本&#xff0c;顺利完成&#xff0c;界面如下所示&#xff1a; 提起的效果如下所示&#xff1a; 输出的txt文本内容如下&#xff1a; 下载链接&#xff1a;https://download.csdn.net/download/u011269801/89905548

vue中如何检测数组变化(vue基础,面试,源码级讲解)

大家有什么不明白的地方可以分享在评论区&#xff0c;大家一起探讨哦~~ &#xff08;如果对数据劫持还有所不明白的小伙伴&#xff0c;可以去看看上一篇文章哦&#xff09; 在vue2中&#xff0c;是如何对数组进行劫持的呢&#xff1f; 简单代码实现&#xff1a; 在vue2中&…

pytorh学习笔记——cifar10(三)模仿VGGNet创建卷积网络

VGG16是由牛津大学视觉几何组&#xff08;Visual Geometry Group&#xff09;提出的一种深度卷积神经网络模型。 VGGNet 探索了卷积神经网络的深度与其性能之间的关系&#xff0c;成功地构筑了 16~19 层深的卷积神经网络&#xff0c;同时拓展性又很强&#xff0c;迁移到其它图片…

反转链表 K个一组翻转链表

目录 LeetCode206 反转链表 LeetCode92 反转链表II LeetCode25 K个一组翻转链表 LeetCode206 反转链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x)…

poisson过程——随机模拟(Python和R实现)

Python实现 exponential()使用&#xff0c;自动poisson过程实现。 import numpy as np import matplotlib.pyplot as plt# Parameters lambda_rate 5 # rate parameter (events per time unit) T 10 # total time# Generate Poisson process times np.random.exponential(…

PCL 点云配准 Trimed-ICP算法(精配准

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 perform_standard_icp 函数 2.1.2 perform_trimmed_icp 函数 2.1.3 visualize_registration 函数 2.2完整代码 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算…

软件设计模式------简单工厂模式

简单工厂模式&#xff08;Simple factory Pattern&#xff09;&#xff0c;又称静态工厂方法(Static Factory Method),属于创新型模式&#xff0c;但它不属于GoF23个设计模式其一。 一、模式动机&#xff1a; 有时需要创建一些来自相同父类的类的实例。 二、定义&#xff1a…

(二十)、从宿主机访问 k8s(minikube) 发布的 redis 服务

文章目录 1、环境准备2、具体操作2.1、启动 minikube (start/stop)2.2、准备 redis-deployment.yaml2.3、执行 redis-deployment.yaml2.3.1、查看 pod 信息和日志 2.4、检查部署和服务状态2.4.1、如果需要删除 3、查看 IP 的几个命令3.1、查看IP的几个命令3.2、解读3.3、宿主机…

【C语言】数据输出格式控制

数据的输出格式修饰 常用两种&#xff1a; 整型中&#xff0c;输出数据左对齐、右对齐、占m位、不足m位前补0。浮点型中&#xff0c;默认通过四舍五入保留小数点后6位&#xff0c;通过参数设置保留小数点后n位。 #include <stdio.h> #define PI 3.14159 /* 功能&#x…

D43【python 接口自动化学习】- python基础之函数

day43 装饰器&#xff08;上&#xff09; 学习日期&#xff1a;20241020 学习目标&#xff1a;函数&#xfe63;- 56 装饰器&#xff1a;函数嵌套的定义与调用的区别 学习笔记&#xff1a; 变量作用域 变量读取顺序&#xff1a;local-》enclosed-》global-》builtin # 变量…

Spring MessageSource国际化原理

spring framework提供MessasgeSource来实现国际化。 MessageSource用法 准备properties文件&#xff0c;放在resources文件夹下面。这是默认语言和韩语的文件。 i18n/message.propertiesi18n/message_ko.properties 文件里面的内容是key-value格式,使用{0}、{1}作为变量占位…

【Next.js 项目实战系列】05-删除 Issue

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 项目实战系列】04-修改 Issue 删除 Issue 添加删除 Button​ 本节代码链接 这里我们主要关注布局…

Win10 IDEA远程连接HBase

Win10 IDEA远程连接HBase Win10 IDEA连接虚拟机中的Hadoop&#xff08;HDFS&#xff09; 关闭Hadoop和Hbase 如果已经关闭不需要走这一步 cd /usr/local/hbase bin/stop-hbase.sh cd /usr/local/hadoop ./sbin/stop-dfs.sh获取虚拟机的ip 虚拟机终端输入 ip a关闭虚拟机…

VS Code开发qt项目

没整明白&#xff0c;尴尬 安装扩展 设置cmake路径 前提是已经安装了QT 报错 用msvc选windows启动&#xff0c;用mingw则选gdb启动

Vue3 新特性、Pinia

一、新特性 - defineOptions 背景说明 因为我们用了<script setup>语法&#xff0c;没办法给setup去提供一些平级的属性&#xff0c;官方就提供了一个叫做 defineOptions 的语法 所以在 Vue3.3 中引入了 defineOptions 宏&#xff0c;用来定义 Options API 的选项。可以…

[OpenCV] 数字图像处理 C++ 学习——17模板匹配详细讲解+附完整代码

文章目录 前言1.理论基础1.1模板匹配介绍1.2匹配算法介绍 2.代码实现2.1模块匹配(matchTemplate)2.2最佳匹配函数(minMaxLoc()) 3.完整代码 前言 模板匹配是图像处理和计算机视觉领域中的一种经典技术&#xff0c;它通过在大图像中搜索与小图像&#xff08;模板&#xff09;匹…

gewechat免费开源微信机器人开发

​聊天机器人&#xff0c;是一种通过自然语言模拟人类进行对话的程序。通常运行在特定的软件平台上&#xff0c;如PC平台或者移动终端设备平台。聊天机器人系统的主要功能是同用户进行基本沟通并自动回复用户有关产品或服务的问题&#xff0c;以实现降低企业客服运营成本、提升…

Tkinter 的布局pack() and grid()笔记

#encodingutf-8 import tkinter import re import tkinter.messagebox import tkinter.simpledialog import sys import os def get_resources_path(relative_path):if getattr(sys,frozen, False):base_pathsys._MEIPASS#获取临时文件else:base_pathos.path.dirname(".&q…