HTTP与Gin框架概述
提到网络服务问题,我们自然而然地会想到HTTP,也就是超文本传输协议(Hypertext Transfer Protocol,HTTP)。HTTP是一个简单的请求-响应协议,通常运行在TCP协议上,在最新的HTTP/3中也可以基于UDP协议实现。其简单模型使得其应用十分广泛,成为我们在网络请求与响应中十分重要的协议。
Go作为后端服务中近年来十分热门的语言,网络接入与服务自然也是Go语言中十分重要的组成部分。Gin是Go语言一个成熟且广泛使用的HTTP框架,可以帮助我们提高性能、简化操作。
安装Gin框架
使用命令
go get -u github.com/gin-gonic/gin
可以在当前项目内安装Gin框架并自动配置go.mod文件
Gin框架示例程序
一个可行的示例程序如下:
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
router := gin.Default()
router.GET("/", func(context *gin.Context) {
context.String(http.StatusOK, "hello world!")
})
router.Run(":8080")
}
在上面的程序中,我们首先生成了一个默认的路由router,随后设置GET请求(这是HTTP四大请求类型之一,现在先不用管它的概念,等后续更深入学习的时候还会了解到),配置与路径相关的回调函数,生成string字符串响应(含状态码http.StatusOK),最后让我们的服务运行在8080端口上。
运行该程序,在浏览器中输入127.0.0.1::8080,即可在本地ip的8080端口接收到回调函数生成的响应字符串,如下图所示。我们上面设置的路径为/代表不需要额外路径的初始URL。
可以在途中看到绿色的200 OK字样,代表当前GET请求成功响应,状态码为200。状态码的其他值对应不同类型的请求结果,如:
- 301 永久重定向
- 302 临时重定向
- 404 页面丢失
- 500 内部服务器错误
- ……
不同类型响应
在示例程序中,我们使用string字符串响应作为访问正确URL之后得到的结果。但其实Gin框架支持的字符串响应除了基础的string字符串外,还包括json、xml、yaml等多种字符串数据格式。除了字符串之外,Gin框架还支持html响应、文件响应、重定向响应等多种不同类型的响应方式。以下将对这些多种的响应方式做简要的介绍。
字符串响应
这里我们将string、json、xml和yaml的响应分别封装在不同的函数中,方便调用时逻辑清晰明了。
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func string_res(context *gin.Context) {
context.String(http.StatusOK, "hello world!")
}
func json_res(context *gin.Context) {
context.JSON(http.StatusOK, gin.H{
"sno": "114514",
"sname": "田所浩二",
"dept": "下北泽表演系",
})
}
func xml_res(context *gin.Context) {
context.XML(http.StatusOK, gin.H{
"sno": "114514",
"sname": "田所浩二",
"dept": "下北泽表演系",
})
}
func yaml_res(context *gin.Context) {
context.YAML(http.StatusOK, gin.H{
"sno": "114514",
"sname": "田所浩二",
"dept": "下北泽表演系",
})
}
func main() {
router := gin.Default()
router.GET("/string", string_res)
router.GET("/json", json_res)
router.GET("/xml", xml_res)
router.GET("/yaml", yaml_res)
router.Run(":8080")
}
通过gin框架内置的map类型接口,gin.H可以快速地初始化为map对象并用于不同类型的响应,分别对不同的URL进行GET请求,可以得到服务端分别作出如下的响应:
在string请求响应中,返回了如示例程序中一致的helloworld字符串。
在json请求响应中,返回了如图所示的json字符串。
在xml请求响应中,返回了如图所示的xml字符串,是和html格式类似的标记语言。
在yaml请求响应中,返回了如图所示的yaml字典字符串,和json相似但是有区别。
文件响应
使用router.StaticFile()方法可以将服务器响应的数据变为文件,只需要一行代码如下:
router.StaticFile("/texas","static/1.jpg")
// router.StaticFS("/fs", http.Dir("static"))
其中第一种方法可以将单个文件置为静态响应文件,第一个参数填写需要响应的URL,第二个参数填写响应文件相对于项目的路径。
第二种方法可以将某个目录置为静态响应目录,可以通过后接不同的后缀来直接访问该目录中不同的文件。
第一种方法的请求响应示例如下:
第二种方法的请求响应示例如下:
如果直接请求静态响应目录本身,则是会返回如图所示的HTML文本,显示出该目录的结构。
重定向响应
出于某种原因,原来存在过的链接现在变得不可用时,我们不能简单的删除这个链接的响应,这会使得用户得到毫无价值的错误信息。相对应的,我们应该对这个链接做重定向处理,当有用户访问这个链接的时候,将会被自动导引到其他链接去(可以是同一网站内部的,也可以是其他外部网站)。
可以用与字符串响应相同的语法去构造某个路径下的重定向响应:
func redirect_res1(context *gin.Context) {
context.Redirect(http.StatusMovedPermanently, "/fs")
}
func redirect_res2(context *gin.Context) {
context.Redirect(http.StatusFound, "https:www.baidu.com")
}
router.GET("/301", redirect_res1)
router.GET("/302", redirect_res2)
其中状态码301对应目标链接资源被永久移动到新的位置,302代表临时移动到新位置。
对127.0.0.1:8080/301的访问会被自动重定向到127.0.0.1:8080/fs。
对127.0.0.1:8080/302的访问会被自动重定向到百度搜索的首页,下图是由于访问到了外部网页,没有在Postman里面正常显示而已,属于正常现象。
小结
本笔记通过Gin框架对HTTP进行了初步探索,以GET类型请求为基础,认识了在请求下的各种响应方式,包括字符串响应、文件响应、重定向响应等。通过这些简单的了解,为以后更进一步深入学习HTTP的其他知识铺垫了基础。