结合Gin框架初探HTTP | 豆包MarsCode AI刷题

62 阅读5分钟

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。

image.png

可以在途中看到绿色的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")
}

image.png

通过gin框架内置的map类型接口,gin.H可以快速地初始化为map对象并用于不同类型的响应,分别对不同的URL进行GET请求,可以得到服务端分别作出如下的响应:

在string请求响应中,返回了如示例程序中一致的helloworld字符串。

image.png

在json请求响应中,返回了如图所示的json字符串。

image.png

在xml请求响应中,返回了如图所示的xml字符串,是和html格式类似的标记语言。

image.png

在yaml请求响应中,返回了如图所示的yaml字典字符串,和json相似但是有区别。

image.png

文件响应

使用router.StaticFile()方法可以将服务器响应的数据变为文件,只需要一行代码如下:

router.StaticFile("/texas","static/1.jpg")
// router.StaticFS("/fs", http.Dir("static"))

其中第一种方法可以将单个文件置为静态响应文件,第一个参数填写需要响应的URL,第二个参数填写响应文件相对于项目的路径。

第二种方法可以将某个目录置为静态响应目录,可以通过后接不同的后缀来直接访问该目录中不同的文件。

第一种方法的请求响应示例如下:

image.png

第二种方法的请求响应示例如下:

image.png

如果直接请求静态响应目录本身,则是会返回如图所示的HTML文本,显示出该目录的结构。

image.png

重定向响应

出于某种原因,原来存在过的链接现在变得不可用时,我们不能简单的删除这个链接的响应,这会使得用户得到毫无价值的错误信息。相对应的,我们应该对这个链接做重定向处理,当有用户访问这个链接的时候,将会被自动导引到其他链接去(可以是同一网站内部的,也可以是其他外部网站)。

可以用与字符串响应相同的语法去构造某个路径下的重定向响应:

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

image.png

127.0.0.1:8080/302的访问会被自动重定向到百度搜索的首页,下图是由于访问到了外部网页,没有在Postman里面正常显示而已,属于正常现象。

image.png

小结

本笔记通过Gin框架对HTTP进行了初步探索,以GET类型请求为基础,认识了在请求下的各种响应方式,包括字符串响应、文件响应、重定向响应等。通过这些简单的了解,为以后更进一步深入学习HTTP的其他知识铺垫了基础。