gin响应| 豆包MarsCode AI刷题

71 阅读3分钟

响应

响应即服务器收到客户端请求所返回的内容或者是行为,在gin中,包含:返回字符串、返回json、返回html、返回文件、重定向。

返回字符串

返回字符串使用Context.String()函数,该函数有两个参数必写,一个是状态码,另外一个就是字符串。客户端将会收到字符串内容。

router.GET("/txt", func(c *gin.Context) {
  c.String(http.StatusOK, "返回txt")
})

返回json

该部分一共有三个函数,分别是Context.JSON()Context.YAML()Context.XML()。这三个分别对应json、yaml和xml格式的数据。使用json的比较多。

首先是json:

router.GET("/moreJSON", func(c *gin.Context) { 
  // You also can use a struct 
  type Msg struct { 
    Name string `json:"user"` 
    Message string 
    Number int 
  } 
  msg := Msg{"123", "hi", 123} 
  // 输出 : {"user": "123", "Message": "hi", "Number": 123} 
  c.JSON(http.StatusOK, msg)

在这里面,我们先定义了一个结构体,然后直接输出这个结构体,因为 gin 能将结构体自动转为 json 数据。在转换时,如果没有指明json名称的话,默认就是结构体属性名,就像上面的 message 和 number 。而name由于我在后面加了`json:user`所以名称不会再叫 name,而是 user 了。

当然,也可以不声明结构体而直接返回 json 数据,这时需要使用gin.H{}来创建数据,如下:

router.GET("/xml", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"user": "123", "message": "hi", "number": 123}) 
})

这样也是能输出对应的json数据的。

对于yaml和xml,方法与json是类似的,既可以用结构体输出,也可以使用gin.H{}来输出:

router.GET("/", func(c *gin.Context) {
    type Msg struct {
       Name    string `json:"user"`
       Message string
       Number  int
    }
    c.XML(http.StatusOK, Msg{"123", "hi", 123})
})

router.GET("/", func(c *gin.Context) {
    type Msg struct {
       Name    string `json:"user"`
       Message string
       Number  int
    }
    c.YAML(http.StatusOK, Msg{"123", "hi", 123})
})

router.GET("/", func(c *gin.Context) {
    c.XML(http.StatusOK, gin.H{"user": "123", "message": "hi", "number": 123})
})

router.GET("/", func(c *gin.Context) {
    c.YAML(http.StatusOK, gin.H{"user": "123", "message": "hi", "number": 123})
})

它们返回的数据内容是一致的,但是格式分别是json、yaml和xml,可以根据自己的需要来选择。

返回HTML

返回 HTML 差不多就是给用户发送一个网页,但是一般这些文件都由前端先写好了,所以 gin 提供了便捷的方法,先使用LoadHTMLGlob()或者LoadHTMLFiles()函数加载全部的 html 文件,然后使用Context.HTML()函数返回 html 文件所需要的一些参数,就实现了动态html网页。当然也可以不返回参数,这样就是很简单的静态网页了:

//加载全部html文件
router.LoadHTMLGlob("ginTest/templates/*")
router.GET("/index", func(c *gin.Context) {
  //需要指定选取哪个html文件作为 /index 的网页
  c.HTML(http.StatusOK, "index.html", gin.H{
    "title": "Main website",
  })
})

返回文件

我们在网络上下载一些软件的时候,当我们点击下载按钮,浏览器可能会短暂跳转到一个空白页面,然后就开始下载软件了,而这里就包含了返回文件这一响应操作。而在 gin 中,需要使用两个函数来实现返回文件,分别是Engine.StaticFS()Engine.StaticFile()。需要先执行StaticFS()函数,绑定上级路由和要返回文件所在的文件夹,再执行StaticFile()函数,绑定具体路由和具体返回的文件。直接上代码会直观很多:


// 在golang中,文件路径只有相对项目的路径,这一点要注意
// 先绑定文件夹
router.StaticFS("/static", http.Dir("static/static"))
// 再配置单个文件
router.StaticFile("/titian.png", "static/titian.png")
//这样输入/static/titian.png路由,就会自动下载titian.png文件了

重定向

有时,当你点进某个网址,会发现它自动跳转到了另外一个网址,这就是重定向响应,这是在服务器端修改客户所要访问的网址,代码如下:

router.GET("/redirect", func(c *gin.Context) { 
  c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com/") 
})

这样,当点进 /redirect 里面时,就会自动跳转到百度搜索去了。