【Golang】Go语言web框架Gin响应客户端有哪些方式

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Gin框架响应客户端方式
    • 一、响应html页面
      • 1、我们首先定义一个存放模板文件的`templates`文件夹
      • 2、让程序进行页面渲染和加载
      • 3、通过请求来响应页面
      • 4、启动测试
      • 5、静态文件处理
    • 二、响应字符串数据
    • 三、响应类型为JSON
      • 1. 返回普通数据类型
      • 2. 返回结构体
        • (1) 不带JSON标签的结构体
        • (2) 带JSON标签的结构体
        • (3) 忽略某些字段
        • (4) 返回map
        • (5) 返回结构体切片
    • 四、响应类型为XML和YAML
      • 1. 响应类型为XML
      • 2. 响应类型为YAML

Gin框架响应客户端方式

Gin是一个用Go语言编写的web框架。它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍。
如果你是性能和高效的追求者, 你会爱上Gin。Gin框架支持多种响应类型,包括字符串、JSON、XML和YAML等。

一、响应html页面

响应页面,就跟我们直接用http编程时的模板渲染差不多

1、我们首先定义一个存放模板文件的templates文件夹

然后在其内部按照业务分别定义一个posts文件夹和一个users文件夹。 两个文件夹中分别有posts/posts.html文件和users/users.html文件。
在这里插入图片描述

users/users.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>我的Go页面</title>
</head>
<body><h1>users 感谢大家来到景天科技苑 Go语言全栈课</h1>获取传入的数据:
{{.msg}}</body>
</html>

posts/posts.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>我的Go页面</title>
</head>
<body><h1>posts 感谢大家来到景天科技苑 Go语言全栈课</h1>获取传入的数据:
{{.msg}}</body>
</html>

2、让程序进行页面渲染和加载

Gin框架中使用 LoadHTMLGlob()或者 LoadHTMLFiles()方法进行HTML模板渲染
LoadHTMLGlob(pattern string):
这个方法接受一个模式(pattern),通常是一个通配符(如"*.html"),用于匹配目录中的所有HTML模板文件。
它会加载指定目录下所有匹配该模式的文件作为模板。
这种方式适合于项目中模板文件较多,且都存放在同一个目录下的情况。

LoadHTMLFiles(files …string):
这个方法接受一个文件名列表,你可以显式地指定要加载的HTML模板文件。
它允许你加载项目中分散在不同目录的模板文件,或者只加载特定的几个模板文件。
这种方式提供了更细粒度的控制,你可以精确选择哪些模板文件被加载。

//指定html模版路径,这个方法接受一个模式(pattern),通常是一个通配符(如"*.html"),用于匹配目录中的所有HTML模板文件。
// func (engine *Engine) LoadHTMLGlob(pattern string)
ginServer.LoadHTMLGlob("templates/*/*")//使用ginServer.LoadHTMLFiles() 这个方法接受一个文件名列表,你可以显式地指定要加载的HTML模板文件。
// func (engine *Engine) LoadHTMLFiles(files ...string)
//这种方式需要把文件名都列出来
//ginServer.LoadHTMLFiles("templates/posts/posts.html", "templates/users/posts.html")// localhost:8088/hello
// 处理请求的函数 *gin.Context
ginServer.GET("/posts/index", func(c *gin.Context) {//响应html页面使用c.HTML()c.HTML(http.StatusOK, "posts.html", gin.H{"msg": "这是后台posts路径返回的数据"})
})//再写个路径
ginServer.GET("/users/index", func(c *gin.Context) {//响应html页面使用c.HTML()c.HTML(http.StatusOK, "users.html", gin.H{"msg": "这是后台users路径返回的数据"})
})

3、通过请求来响应页面

使用c.HTML()方法,并需要加载HTML模板文件。

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {//以生产模式运行//gin.SetMode(gin.ReleaseMode)// 创建gin服务,创建一个默认的路由引擎ginServer。然后可以根据ginServer.GET,ginServer.ROST,ginServer.DELETE等内置函数处理客户端发来的http请求。ginServer := gin.Default()//指定html模版路径,这个方法接受一个模式(pattern),通常是一个通配符(如"*.html"),用于匹配目录中的所有HTML模板文件。// func (engine *Engine) LoadHTMLGlob(pattern string)ginServer.LoadHTMLGlob("templates/*")//使用ginServer.LoadHTMLFiles() 这个方法接受一个文件名列表,你可以显式地指定要加载的HTML模板文件。// func (engine *Engine) LoadHTMLFiles(files ...string)//这种方式需要把文件名都列出来//ginServer.LoadHTMLFiles("templates/posts/index.html", "templates/users/index.html")// localhost:8088/hello// 处理请求的函数 *gin.ContextginServer.GET("/posts/index", func(c *gin.Context) {//响应html页面使用c.HTML()c.HTML(http.StatusOK, "index.tmpl", gin.H{"msg": "这是后台posts路径返回的数据"})})//再写个路径ginServer.GET("/users/index", func(c *gin.Context) {//响应html页面使用c.HTML()c.HTML(http.StatusOK, "index.tmpl", gin.H{"msg": "这是后台users路径返回的数据"})})// 启动HTTP服务,可以修改端口。默认是8080端口err := ginServer.Run(":8088")if err != nil {return}
}

4、启动测试

在这里插入图片描述

在这里插入图片描述

5、静态文件处理

当我们渲染的HTML文件中引用了静态文件时,我们只需要按照以下方式在渲染页面前调用gin.Static方法即可。
ginServer.Static(url string, path string)
url:URL前缀,客户端通过这个前缀来访问静态文件。
path:静态文件所在的目录路径。Gin 会将这个目录下的文件映射到指定的URL前缀下。

文件结构
在这里插入图片描述

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {//以生产模式运行//gin.SetMode(gin.ReleaseMode)// 创建gin服务,创建一个默认的路由引擎ginServer。然后可以根据ginServer.GET,ginServer.ROST,ginServer.DELETE等内置函数处理客户端发来的http请求。ginServer := gin.Default()//指定html模版路径,这个方法接受一个模式(pattern),通常是一个通配符(如"*.html"),用于匹配目录中的所有HTML模板文件。// func (engine *Engine) LoadHTMLGlob(pattern string)//ginServer.LoadHTMLGlob("templates/*/*")//使用ginServer.LoadHTMLFiles() 这个方法接受一个文件名列表,你可以显式地指定要加载的HTML模板文件。// func (engine *Engine) LoadHTMLFiles(files ...string)//这种方式需要把文件名都列出来ginServer.LoadHTMLFiles("templates/posts/posts.html", "templates/users/users.html")// 处理请求的函数 *gin.ContextginServer.GET("/posts/index", func(c *gin.Context) {//响应html页面使用c.HTML()c.HTML(http.StatusOK, "posts.html", gin.H{"msg": "这是后台posts路径返回的数据"})})//再写个路径ginServer.GET("/users/index", func(c *gin.Context) {//响应html页面使用c.HTML()c.HTML(http.StatusOK, "users.html", gin.H{"msg": "这是后台users路径返回的数据"})})// 静态资源//引入css样式文件 这样需要访问静态资源的时候只需要在域名后面加上/static   就能访问当前staticData目录下的静态资源// 例如,如果客户端请求 /static/css/main.css,Gin会尝试从 ./staticData/css/main.css 文件中提供内容。ginServer.Static("/static", "staticData")// 启动HTTP服务,可以修改端口。默认是8080端口err := ginServer.Run(":8088")if err != nil {return}
}

前端html因日css静态文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>我的Go页面</title><link rel="stylesheet" href="/static/css/main.css">
</head>
<body><h1>posts 感谢大家来到景天科技苑 Go语言全栈课</h1>获取传入的数据:
{{.msg}}</body>
</html>

浏览器请求,可见css样式生效
在这里插入图片描述

二、响应字符串数据

Gin框架可以很方便地返回字符串类型的响应。以下是一个返回字符串响应的示例:

package main  import (  "net/http"  "github.com/gin-gonic/gin"  
)  func StringResponse(c *gin.Context) {  c.String(http.StatusOK, "This is string response")  
}  func main() {  r := gin.Default()  r.GET("/string", StringResponse)  r.Run(":8080")  
}

在这个示例中,定义了一个StringResponse函数,用于处理/string路径的GET请求。当客户端请求这个路径时,服务器会返回字符串"This is string response"。

三、响应类型为JSON

Gin框架支持将结构体或map类型的数据转换为JSON格式的响应。

1. 返回普通数据类型

package mainimport ("github.com/gin-gonic/gin"
)func main() {// 创建gin服务,创建一个默认的路由引擎ginServer。然后可以根据ginServer.GET,ginServer.ROST,ginServer.DELETE等内置函数处理客户端发来的http请求。ginServer := gin.Default()// localhost:8088/hello// 处理请求的函数 *gin.ContextginServer.GET("/hello", func(c *gin.Context) {// c.JSON:响应给客户端JSON格式的数据 func (c *Context) JSON(code int, obj any)// gin.H : 参数 key value// gin.H 是一个便捷的快捷方式,你也可以直接使用 map[string]interface{} 来代替它c.JSON(200, gin.H{"message": "Hello world!"})})// 启动HTTP服务,可以修改端口。默认是8080端口ginServer.Run(":8088")
}

在这里插入图片描述

2. 返回结构体

(1) 不带JSON标签的结构体
package mainimport ("github.com/gin-gonic/gin""net/http"
)func JsonResponse(c *gin.Context) {// 定义的结构体不带json标签type UserInfo struct {UserName stringAge      int}user := UserInfo{UserName: "jingtian", Age: 20}// 这里直接将不带标签的结构体返回c.JSON(http.StatusOK, user)
}func main() {r := gin.Default()r.GET("/json", JsonResponse)r.Run(":8080")
}

在这个示例中,定义了一个UserInfo结构体,并将其实例化为user变量。然后,使用c.JSON(http.StatusOK, user)语句将user变量转换为JSON格式的响应返回给客户端。
响应的json字段名称就是结构体原本字段名
在这里插入图片描述

(2) 带JSON标签的结构体

有时,我们希望结构体字段在JSON响应中使用不同的名称。这时,可以使用结构体标签(struct tag)来实现。
定义结构体的时候,带上json标签,标签可以与结构体字段不一样,这样当我们返回结构体的时候,返回的json字段是标签字段

package mainimport ("github.com/gin-gonic/gin""net/http"
)func JsonResponse(c *gin.Context) {// 定义结构体的时候,带上json标签,标签可以与结构体字段不一样,这样当我们返回结构体的时候,返回的json字段是标签字段type UserInfo struct {UserName string `json:"user_name"`Age      int    `json:"age"`}user := UserInfo{UserName: "景天带标签", Age: 20}c.JSON(http.StatusOK, user)
}func main() {r := gin.Default()r.GET("/json", JsonResponse)r.Run(":8080")
}

结构体的字段时username 而我们返回的json字符串中是我们定义的标签user_name
在这里插入图片描述

在这个示例中,UserInfo结构体的字段使用了json标签,指定了在JSON响应中使用的名称。因此,返回的JSON响应为{“user_name”:“json”,“age”:20}。

(3) 忽略某些字段

有时,我们可能不希望将结构体的所有字段都包含在JSON响应中。这时,可以使用-标签来忽略某些字段。
忽略该字段 使用- 标签 这样,响应的json中就不包含该字段

package mainimport ("github.com/gin-gonic/gin""net/http"
)func JsonResponse(c *gin.Context) {type UserInfo struct {UserName string `json:"user_name"`Age      int    `json:"age"`Password string `json:"-"` // 忽略该字段  使用- 标签  这样,响应的json中就不包含该字段}user := UserInfo{UserName: "景天忽略字段", Age: 20, Password: "secret"}c.JSON(http.StatusOK, user)
}func main() {r := gin.Default()r.GET("/json", JsonResponse)r.Run(":8080")
}

在这个示例中,Password字段使用了-标签,因此它不会被包含在JSON响应中。
在这里插入图片描述

(4) 返回map

除了结构体之外,还可以使用map类型的数据来生成JSON响应。

package mainimport ("github.com/gin-gonic/gin""net/http"
)func JsonResponse(c *gin.Context) {// 定义mapdata := map[string]interface{}{"user_name": "景天map","age":       20,}//直接将map返回c.JSON(http.StatusOK, data)
}func main() {r := gin.Default()r.GET("/json", JsonResponse)r.Run(":8080")
}

在这里插入图片描述

(5) 返回结构体切片

有时候我们需要返回一个切片,里面是一个个的结构体

package mainimport ("github.com/gin-gonic/gin"
)func main() {// 创建gin服务ginServer := gin.Default()// localhost:8080/hello// 处理请求的函数 *gin.ContextginServer.GET("/hello", func(c *gin.Context) {//定义结构体type User struct {Username string `json:"username"`Password string `json:"password"`}//定义User类型的切片users := make([]User, 2)//给切片赋值users[0] = User{"景天哥", "123456"}users[1] = User{"赵日天", "895456"}//响应结构体切片c.JSON(200, users)})// 启动HTTP服务,可以修改端口ginServer.Run(":8088")
}

在这里插入图片描述

四、响应类型为XML和YAML

除了JSON之外,Gin框架还支持将数据转换为XML和YAML格式的响应。以下是一些示例:

1. 响应类型为XML

package mainimport ("encoding/xml""github.com/gin-gonic/gin""net/http"
)func XmlResponse(c *gin.Context) {type UserInfo struct {XMLName  xml.Name `xml:"user"`UserName string   `xml:"user_name"`Age      int      `xml:"age"`}user := UserInfo{UserName: "xml", Age: 30}// 使用c.XML返回xml格式c.XML(http.StatusOK, user)
}func main() {r := gin.Default()r.GET("/xml", XmlResponse)r.Run(":8080")
}

注意:在这个示例中,需要使用encoding/xml包来处理XML数据。由于篇幅限制,这里省略了导入包的语句。
在这里插入图片描述

2. 响应类型为YAML

package mainimport ("github.com/gin-gonic/gin""gopkg.in/yaml.v3""net/http"
)func YamlResponse(c *gin.Context) {type UserInfo struct {UserName string `yaml:"user_name"`Age      int    `yaml:"age"`}user := UserInfo{UserName: "yaml", Age: 40}//yaml序列化// func Marshal(in interface{}) (out []byte, err error)data, err := yaml.Marshal(user)if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})return}// 通过c.Data响应为yaml数据c.Data(http.StatusOK, "application/x-yaml", data)
}func main() {r := gin.Default()r.GET("/yaml", YamlResponse)r.Run(":8080")
}

在这个示例中,使用了gopkg.in/yaml.v3包(需要安装这个包)来处理YAML数据。
yaml.Marshal(user)函数将user变量转换为YAML格式的字节数组,然后使用c.Data方法将字节数组作为响应返回给客户端。
同时,设置了响应头Content-Type为application/x-yaml,以指示客户端这是一个YAML格式的响应。
浏览器访问该url就会下载yaml文件
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Navigation2 算法流程

转自 https://zhuanlan.zhihu.com/p/405670882 此文仅作学习笔记 启动流程 在仿真环境中启动导航包的示例程序&#xff0c;执行nav2_bringup/bringup/launch/tb3_simulation_launch.py文件。ROS2的launch文件支持采用python语言来编写以支持更加复杂的功能&#xff0c;本文件…

个人用操作系统笔记(待补充)

文章目录 一、绪论二、Linux操作系统进程线程&#xff08;进程内的基本调度单位&#xff09;文件与设备文件权限文件系统文件连接&#xff08;共享&#xff09; 地址空间缺页中断 用户超级用户root&#xff08;用户标识与组标识都是0&#xff09; 重定向系统启动常用命令 OS研究…

【优选算法篇】踏入算法的深邃乐章:滑动窗口的极致探秘

文章目录 C 滑动窗口详解&#xff1a;进阶题解与思维分析前言第二章&#xff1a;进阶挑战2.1 水果成篮解法一&#xff1a;滑动窗口解法二&#xff1a;滑动窗口 数组模拟哈希表复杂度分析&#xff1a;图解分析&#xff1a;示例&#xff1a;滑动窗口执行过程图解&#xff1a; 详…

ARM嵌入式学习--第三天

ARM常用伪指令分析 ARM伪指令&#xff1a;为了方便程序员使用&#xff0c;编译器设计的指令&#xff0c;这个指令ARM核无法识别&#xff0c;需要编译器对它翻译成ARM核所识别的指令 -LDR R1&#xff0c;0xabcdef分析 总结&#xff1a; 编译器在编译的时候&#xff0c;将ldr r…

深入拆解TomcatJetty(一)

深入拆解Tomcat&Jetty&#xff08;一&#xff09; 专栏地址&#xff1a;https://time.geekbang.org/column/intro/100027701 1、Web容器是什么 早期的 Web 应用主要用于浏览新闻等静态页面&#xff0c;HTTP 服务器&#xff08;比如 Apache、Nginx&#xff09;向浏览器返…

008、相交链表

0、题目描述 相交链表 1、法1 嵌套循环&#xff0c;从listA的第一个节点开始与listB的每个节点比对&#xff0c;有相同的就返回这个节点。 时间复杂度是n^2 struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* pa …

多媒体(1)

多媒体 多媒体的信息结构是【非线性的网状结构】 多媒体技术的基本特征&#xff1a;集成性、交互性、实时性、数字化、多样性 多媒体数据具有【数据量大】、【数据类型多】、【数据类型间区别小】、【输入输 出复杂】的特点 在多媒体数据库中&#xff0c;基于内容检索的关键技术…

智联云采 SRM2.0 testService SQL注入漏洞复现

0x01 产品简介 智联云采是一款针对企业供应链管理难题及智能化转型升级需求而设计的解决方案,针对企业供应链管理难题,及智能化转型升级需求,智联云采依托人工智能、物联网、大数据、云等技术,通过软硬件系统化方案,帮助企业实现供应商关系管理和采购线上化、移动化、智能…

【AI绘画】Midjourney进阶:引导线构图详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;什么是构图为什么Midjourney要使用构图 &#x1f4af;引导线构图特点使用场景提示词书写技巧测试 &#x1f4af;小结 &#x1f4af;前言 【AI绘画】Midjourney进阶&a…

嵌入式职业规划

嵌入式职业规划 在嵌入式的软件开发中&#xff0c;可以分为&#xff1a; 嵌入式MCU软件开发工程师&#xff1b; 嵌入式Linux底层&#xff08;BSP&#xff09;软件开发工程师&#xff1b; 嵌入式Linux应用开发工程师&#xff1b; 嵌入式FPGA算法开发工程师 对于前两个阶段 …

【时间之外】IT人求职和创业应知【9】

目录 1. 云计算ETF领涨,中证云计算与大数据主题指数估值较低 2. 南向资金持有海螺创业市值减少,但仍保持高比例持股 3. 深创赛澳大利亚分站赛落幕,龙岗区与3个意向落地项目签约 认知决定你的赚钱能力。以下是今天可能影响你求职和创业的热点新闻: 今日关键字:数字战争…

ChatGPT官方自带的测试页面 Playground

Playground页面相当于是网页端的大模型调用应用&#xff0c;可以在这里直接选择不同类型模型、选择不同的参数、输入不同的提示测试模型输出结果&#xff0c;并且这个页面还可以查看网页端操作对应的代码&#xff0c;整体操作流程非常便捷&#xff0c;也非常适合初学者进行零代…

UE5 猎户座漂浮小岛 02 模型 地形

UE5 猎户座漂浮小岛 02 模型 地形 1.模型 1.1 导入 1.2 统一模型比例 1.3 添加碰撞体 2.地形 2.1 地 2.2 山体 2.3 海洋 2.4 花草

关于武汉芯景科技有限公司的限流开关芯片XJ6288开发指南(兼容SY6288)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 1.EN引脚控制IN和OUT引脚的通断 2.OCB引脚指示状态 3.过流自动断开

Java基于SSM框架的教学辅助微信小程序【附源码、文档】

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

构建后端为etcd的CoreDNS的容器集群(六)、编写自动维护域名记录的代码脚本

本文为系列测试文章&#xff0c;拟基于自签名证书认证的etcd容器来构建coredns域名解析系统。 一、前置文章 构建后端为etcd的CoreDNS的容器集群&#xff08;一&#xff09;、生成自签名证书 构建后端为etcd的CoreDNS的容器集群&#xff08;二&#xff09;、下载最新的etcd容…

hdfs的客户端(big data tools插件)

1.下载hadoop的压缩包在Windows,后解压 2.下载hadoop.dll文件和winutil.exe文件(网上自行查找) 下载完把这两个文件放入hadoop的bin目录 3.设置环境变量: $HADOOP_HOME指向hadoop的文件夹 4.在jetbrains公司的软件里下载big data tools插件:(在此展示的idea的) 下载完重启ide…

1.ubuntu下安装noetic

1.首先安装常规手段安装乌班图系统 2.开始ROS 系统安装 1. 设置编码 $ sudo apt update && sudo apt install locales $ sudo locale-gen en_US en_US.UTF-8 $ sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 $ export LANGen_US.UTF-82.添加源 $ sudo ap…

OpenMediaVault安装插件以及重置web控制台密码

常用插件&#xff08;可根据实际情况选择安装&#xff09; openmediavault-flashmemory&#xff1a;加载临时文件到内存&#xff0c;保护硬盘&#xff1b;openmediavault-fail2ban &#xff1a;扫描日志文件并禁止显示恶意迹象的IP-太多的密码错误&#xff0c;寻找漏洞等&…

【YOLOv11】制作使用YOLOv11的docker环境

目录 一 安装docker 1 安装依赖 2 添加docker官网 GPG 密钥、设置stable 仓库 3 安装 4 使用 二 环境制作 ① 拉基础镜像 ② 起容器 ③ 安装Anaconda3 ④ 安装YOLO11 ⑤ /root/.bashrc ⑥ 退出容器 ⑦ 保存镜像 ⑧ 镜像的使用 一 安装docker ubuntu:20.04 1 安装…