gin框架学习笔记(二) ——相关数据与文件的响应

前言

在看是今天的内容之前,我们收先来探究一下:什么是Web应用工作的原理?当然这个问题其实论述起来是很麻烦的,但是我们将它无限的缩小,其实可以简化为一个C/S模型,客户端(Client)负责发送请求,服务端(Server,也就使我们的Web应用)接收 请求,来进行相关的操作,模型如下:
在这里插入图片描述
而今天我们所要介绍的就是服务端如何进行相关数据的响应

Http响应码

在HTTP协议定义了一组状态码,用于指示服务器对请求的处理结果,这里我们只对比较常见的做一下简单介绍,想要了解更多的话大家可以参考下面这篇博文:
HTTP状态码大全(常见 HTTP Status Code 含义查询)

  • 200:成功,
  • 404:资源未找到,
  • 500:服务器内部错误

Json

在上一篇文章中我们利用gin框架实现了与浏览器的交互,在网页上面打印了hello world,这是一个很典型的响应字符串,而在响应Json中,除了一些细节以外本质上其实还是类似的,比如下面这个Json响应的代码:

package mainimport ("github.com/gin-gonic/gin"
)type UserInfo struct {Name string `json:"user"`Age  int    `json:"age"`
}func toJson(c *gin.Context) { //响应Json的函数user := UserInfo{Name: "Fengxu",Age:  23,}c.JSON(200, user)
}func main() {r := gin.Default()r.GET("/", toJson)err := r.Run(":8080")if err != nil {return}
}

运行我们会看到页面上出现了Json字符串:
在这里插入图片描述

关于Json响应的细节

  • Get函数
    gin 包提供了 GET 函数来定义处理 HTTP GET 请求的路由,我们来看一下Get函数的签名:
func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {return group.handle(http.MethodGet, relativePath, handlers)
}

这里有两个参数:
1.path:path 是该路由的路径,可以包含参数,例如上面的路径就是:http://127.0.0.1:8080/
2.handlers:路由处理函数,这里用了可变参数,所以这里其实可以有多个路由处理函数

  • 这里拓展一下Json响应的两种不同写法:

    • 将信息存储到map中
    func toJson(c *gin.Context) { //响应Json的函数usermap := map[string]string{"user": "张三","age":  "18",}c.JSON(200, usermap)
    }
    
    • 使用原始Json字符串
    func toJson(c *gin.Context) { //响应Json的函数c.JSON(200, gin.H{"user": "zhangsan", "age": 18})
    }
    
  • 如果我们有些消息不想显示在网页上面,可以想下面这样写:

package mainimport ("github.com/gin-gonic/gin"
)type UserInfo struct {Name     string `json:"user"`Age      int    `json:"age"`password string `json:"-"`
}func toJson(c *gin.Context) { //响应Json的函数user := UserInfo{Name:     "luoyu",Age:      18,password: "123456",}c.JSON(200, user)
}func main() {r := gin.Default()r.GET("/", toJson)err := r.Run(":8080")if err != nil {return}
}

运行结果:
在这里插入图片描述

xml与yaml

  • Xml
package mainimport ("github.com/gin-gonic/gin"
)func toXml(c *gin.Context) { //响应Json的函数c.XML(200, gin.H{"user": "zhangsan", "age": 18})
}func main() {r := gin.Default()r.GET("/", toXml)err := r.Run(":8080")if err != nil {return}
}

在这里插入图片描述

  • Yaml
package mainimport ("github.com/gin-gonic/gin"
)func toYAml(c *gin.Context) { //响应Json的函数c.YAML(200, gin.H{"user": "zhangsan", "age": 18})
}func main() {r := gin.Default()r.GET("/", toYAml)err := r.Run(":8080")if err != nil {return}
}
  • YAML
package mainimport ("github.com/gin-gonic/gin"
)func toYAml(c *gin.Context) { //响应Json的函数c.YAML(200, gin.H{"user": "zhangsan", "age": 18})
}func main() {r := gin.Default()r.GET("/", toYAml)err := r.Run(":8080")if err != nil {return}
}

HTML

HTML与上面的几个不同,接下来我给大家演示一下如何加载一个HTML模版:

首先我们在项目里面创建一个template文件夹,然后我们创建index.html,尝试写一个简单的页面:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
hello {{.username}} 
</body>
</html>

然后我们尝试响应HTML:

package mainimport ("github.com/gin-gonic/gin"
)func toHtml(c *gin.Context) { //响应Json的函数c.HTML(200, "index.html", gin.H{"username": "fengxu"})
}func main() {r := gin.Default()r.LoadHTMLGlob("template/*")r.GET("/", toHtml)err := r.Run(":8080")if err != nil {return}
}

运行结果为:
在这里插入图片描述

注意: 我们在使用c.HTML函数签,要先加载模版文件:

func (engine *Engine) LoadHTMLFiles(files ...string)  //加载单/多个html文件
func (engine *Engine) LoadHTMLGlob(pattern string)  //加载该路径下所有的html文件

文件响应

  • 单个文件响应
    这里我准备了一张照片,我们可以尝试来将它和浏览器交互,让我们可以在网页上看到它:
    在这里插入图片描述
    首先我在项目文件夹中创建source文件夹,表示这里存放一些相关资源,在这里插入图片描述
    然后我们可以使用StaticFile来实现上述操作,代码如下:
package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.StaticFile("/file", "Source/static/img.png")err := r.Run(":8080")if err != nil {return}
}

运行结果为;
在这里插入图片描述

  • 响应指定文件夹里面的内容
    有时候我们只希望Source里面指定文件夹可以访问,但是其他的不能访问,我们可以这样来写,首先我们创建一个文件夹public,在里面创建a.txt,内容如下:
aguihylsywiop;s1yho
hjgiuzoagiusu1i

然后我们尝试来加载这个文件夹:

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()//r.StaticFile("/file", "Source/static/img.png")r.StaticFS("/static", http.Dir("Source/public"))err := r.Run(":8080")if err != nil {return}
}

这样我们指定文件就可以访问了:
在这里插入图片描述
补充
函数解析:

  • StaticFile:

    • StaticFile 函数用于将单个静态文件映射到指定的 URL 路径上。
    • 它接受两个参数:URL 路径和文件路径。
  • StaticFS 函数

    • 用于将一个目录中的所有静态文件映射到指定的 URL 路径上。
    • 它接受两个参数:URL 路径和目录路径。

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

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

相关文章

docker 容器无法直接读取宿主机文件

最近一个需求, 要在后端直接使用代码直接生成 pdf 文档, 由于使用的 apache 的工具包, 该工具包无法直接解析中文字体, 需要导入外部 中文插件包, 相关代码如下: PDPage page new PDPage(PDRectangle.A4);document.addPage(page);PDFont fontFile PDType0Font.load(document…

C++ VScode: launch: program ...... dose not exist

VScode: launch: program … dose not exist 介绍 参考VS Code 配置 C/C 编程运行环境&#xff08;保姆级教程&#xff09;教程配置了VSCode。在配置launch.json适用多个.c 文件编译时&#xff0c;弹出下面错误。 原因和解决方法 是task.json 默认配置的问题。 默认的 cwd参…

Redis20种使用场景

Redis20种使用场景 1缓存2抽奖3Set实现点赞/收藏功能4排行榜5PV统计&#xff08;incr自增计数&#xff09;6UV统计&#xff08;HeyperLogLog&#xff09;7去重&#xff08;BloomFiler&#xff09;8用户签到&#xff08;BitMap&#xff09;9GEO搜附近10简单限流11全局ID12简单分…

AVL树的旋转

目录 1.平衡因子 2.旋转 a.节点定义 b.插入 插入 平衡因子更新 旋转 左单旋 右单旋 右左双旋 左右双旋 3.AVL树的验证 1.平衡因子 我们知道搜索二叉树有缺陷&#xff0c;就是不平衡&#xff0c;比如下面的树 什么是搜索树的平衡&#xff1f;就是每个节点的左右子树的…

机器学习——6.模型训练案例: 预测儿童神经缺陷分类TD/ADHD

案例目的 有一份EXCEL标注数据&#xff0c;如下&#xff0c;训练出合适的模型来预测儿童神经缺陷分类。 参考文章&#xff1a;机器学习——5.案例: 乳腺癌预测-CSDN博客 代码逻辑步骤 读取数据训练集与测试集拆分数据标准化数据转化为Pytorch张量label维度转换定义模型定义损…

Hive的文件存储格式

TEXTFILE 文本文件,默认的文件存储格式,内容是可以直接查看,用来保存非结构化数据; 特点:文本文件的格式一旦定义就无法改变. 除TEXTFILE外,其他文件存储格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中, 然后再从表中用insert导入SequenceFile,RCFile,…

权限束缚术--权限提升你需要知道这些

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要对渗透测试中权限提升的一些基础知识进行整理 并不包含权限提升的具体操作 适合要入门权限提升的朋友 提权的重要性 我们在渗透网站时&#xff0c;我们往往会拿到一些权限&#xff0c;但是我们的权限有…

C语言什么是散列法?

一、问题 什么是散列法&#xff1f; 二、解答 散列法是⼀种将字符组成字符串&#xff0c;转换为固定长度&#xff08;⼀般是更短长度&#xff09;的数值或索引值的⽅法&#xff0c;也叫哈希法&#xff0c;⼜可以称为杂凑法或关键码⼀地址转换法。 那么&#xff0c;通过散列函数…

Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)

1 漏洞描述 CVE-2020-1938 是 Apache Tomcat 中的一个严重安全漏洞&#xff0c;该漏洞涉及到 Tomcat 的 AJP&#xff08;Apache JServ Protocol&#xff09;连接器。由于 AJP 协议在处理请求时存在缺陷&#xff0c;攻击者可以利用此漏洞读取服务器上的任意文件&#xff0c;甚至…

融入新科技的SLM27211系列 120V, 3A/4.5A高低边高频门极驱动器兼容UCC27284,MAX15013A

SLM27211是高低边高频门极驱动器&#xff0c;集成了120V的自举二极管&#xff0c;支持高频大电流的输出&#xff0c;可在8V~17V的宽电压范围内驱动MOSFET&#xff0c;独立的高、低边驱动以方便控制&#xff0c;可用于半桥、全桥、双管正激和有源钳位正激等拓。有极好的开通、关…

AI早班车5.11

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

HTTPS 原理和 TLS 握手机制

HTTPS的概述与重要性 在当今数字化时代&#xff0c;网络安全问题日益凸显&#xff0c;数据在传输过程中的安全性备受关注。HTTPS 作为一种重要的网络通信协议&#xff0c;为数据的传输提供了强有力的安全保障。它是在 HTTP 的基础上发展而来&#xff0c;通过引入数据加密机制&a…