Gin多数据返回请求结果——Go Gin框架(四)

完整的请求

一个完整的请求应该包含请求处理请求返回结果三个步骤,在服务器端对请求处理完成之后,应该将结果返回给客户端。

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引擎访问。
      1. code int:返回的状态码
      1. name string:要加载的HTML模板名
      1. 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
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注