响应
响应即服务器收到客户端请求所返回的内容或者是行为,在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 里面时,就会自动跳转到百度搜索去了。