完整的请求
一个完整的请求应该包含请求、处理请求和返回结果三个步骤,在服务器端对请求处理完成之后,应该将结果返回给客户端。
Gin框架中提供了一下返回请求的数据格式
[]byte 和 string
之前的实例中,我们都用[]byte
来返回数据。
func (ResponseWriter) Write([]byte) (int, error)
:用于向接收端输出[]byte
切片。该方法被定义于官方的http包中func (ResponseWriter) WriteString(string) (int, error)
:用于向接收端输出string
。该方法被定义在context包中
JSON
在项目开发中,JSON格式规范使用更为普遍。Gin框架直接支持将返回数据组装成JSON格式返回给客户端。
将map格式转换成JSON格式
func mapToJSON(engine *gin.Engine) {
engine.GET("/mapToJSON", func(context *gin.Context) {
fmt.Println("request route: ", context.FullPath())
//向前端传回JSON数据
context.JSON(200, map[string]interface{}{
"code": 0, //在开发过程中,自己定义的一个状态码。这里用0代表成功
"message": "OK", //返回的一个状态码
"data": "request route: " + context.FullPath(), //返回的内容
})
})
}
func (c *Context) JSON(code int, obj interface{})
:这个函数可以将map[string]interface{}
类型的变量自动地转换成json数据,并返回给前端。其有两个参数,- 第一个
code int
表示返回的http状态码,可选200、300等状态码,或者直接使用golang提供的net/http
包中的http.StatusOK
(代表200状态码)等已经定义好的常量。 - 第二个
obj interface{}
表示任意obj,这里可以是map[string]interface{}
类型或者是struct
类型(下一个示例)。
- 第一个
将struct格式转换为JSON格式
type Response struct {
Code int
Message string
Data interface{}
}
func structToJSON(engine *gin.Engine) {
engine.GET("/structToJSON", func(context *gin.Context) {
fmt.Println("request route: ", context.FullPath())
resp := Response{
Code: 0,
Message: "OK",
Data: "request route: " + context.FullPath(),
}
context.JSON(200, &resp)
})
}
HTML
除了JSON格式以外,gin框架还支持返回HTML格式的数据。可以直接渲染HTML页面。
HTML模板传入
func returnHTML(engine *gin.Engine) {
engine.GET("/returnHTML", func(context *gin.Context) {
fmt.Println("request route: ", context.FullPath())
//设置html文件目录的位置。设置过以后,这些html文件才能被engine访问
engine.LoadHTMLGlob("./returnResultFormat/HTML/*")
//设置静态文件目录(映射)
engine.Static("/img","./returnResultFormat/image")
//错误示范:context.HTML(http.StatusOK, "./returnResultFormat/HTML/index.html", nil) //直接这样加载会报错。
context.HTML(http.StatusOK, "index.html", gin.H{
"something":"这句话是由后端传入的",
})
})
}
func (c *Context) HTML(code int, name string, obj interface{})
:这个函数用于向前端返回一个HTML文档。被返回的HTML文档必须先由func (engine *Engine) LoadHTMLGlob(pattern string)
函数定义html文件目录的位置,只有被定义过的内容才能被gin引擎访问。-
code int
:返回的状态码
-
name string
:要加载的HTML模板名
-
obj interface{}
:要传入的模板信息,一般使用gin提供的结构type H map[string]interface{}
(gin.H)传入。在前端的默认定义为{{.something}}
。如果不需要传入信息,可以传入nil
-
设置HTML文件
func (engine *Engine) LoadHTMLGlob(pattern string)
:这个函数用于指定HTML模板的位置。只有设置过以后,这些html文件才能被engine访问。pattern string
HTML模板文件位置,这个位置可以相对于文件根目录指定。若想添加一个文件夹下所有的HTML文档,可以使用./path/*
来传入。
设置静态资源的目录
func (group *RouterGroup) Static(relativePath string, root string) IRoutes
:这个函数用于指定静态文件(img等)的位置。只有设置过以后,才能被engine访问。通过这个函数指定的静态文件目录是映射关系relativePath string
相对位置,指从前端页面访问该静态资源的位置。root string
根目录位置,指engine引擎要从硬盘中的哪个位置找到该静态资源。注:这两个参数接受的都是文件夹路径,而非设置HTML文件处所代表的“文件”。所以无需在路径结尾添加*
号。
附:前端HTML页面代码
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>Mona's Gin Test</title>
</head>
<body>
<p>HTML页面已加载</p>
<br>
<p>{{.something}}</p>
<p>上面的话是由模板系统传入</p>
<p>下面这张图片是静态资源的用例</p>
<img src="./img/74020281_p0.png">
</body>
</html>
附:项目路径树
$> tree /t ./
MONAGINWEB
│
└─returnResultFormat
│ byteAndString.go
│ cmd.go
│ html.go
│ json.go
│
├─HTML
│ index.html
│
└─image
74020281_p0.png