我们都知道,一个完整的请求包含请求、处理请求和结果返回三个步骤,在服务器端对请求处理完成以后,会将结果返回给客户端。

在gin框架中,支持返回多种请求数据格式。本节课我们来详细学习一下。

[]byte

在之前的课程案例中,我们统一使用的请求返回数据格式为[]byte。通过context.Writer.Write方法写入[]byte数据。编码案例如下所示:


engine := gin.Default()
engine.GET("/hello", func(context *gin.Context) {
        fullPath := "请求路径:" + context.FullPath()
        fmt.Println(fullPath)
        context.Writer.Write([]byte(fullPath))
})
engine.Run()

如上段代码所示,使用context.Writer.Write向客户端写入返回数据。Writer是gin框架中封装的一个ResponseWriter接口类型。ResponseWriter源码定义如下所示:

type ResponseWriter interface {
    http.ResponseWriter
    http.Hijacker
    http.Flusher
    http.CloseNotifier

    // Returns the HTTP response status code of the current request.
    Status() int

    // Returns the number of bytes already written into the response http body.
    // See Written()
    Size() int

    // Writes the string into the response body.
    WriteString(string) (int, error)

    // Returns true if the response body was already written.
    Written() bool

    // Forces to write the http header (status code + headers).
    WriteHeaderNow()

    // get the http.Pusher for server push
    Pusher() http.Pusher
}Copy

其中的write方法就是http.ResponseWriter中包含的方法。

string

除了write方法以外,ResponseWriter自身还封装了WriteString方法返回数据。

...
// Writes the string into the response body.
WriteString(string) (int, error)
...Copy

和[]byte类型调用一样,可以通过Writer进行调用。详细编程示例如下所示:

...
engine.GET("/hello", func(context *gin.Context) {
        fullPath := "请求路径:" + context.FullPath()
        fmt.Println(fullPath)
        context.Writer.WriteString(fullPath)
})
...Copy

JSON

除了使用context.Writer对象返回[]byte和string类型的数据意外。在项目开发中,JSON格式规范使用的更为普遍。gin为了方便开发者更方便的使用该框架进行项目开发,直接支持将返回数据组装成JSON格式进行返回。

gin框架中的context包含的JSON方法可以将结构体类型的数据转换成JSON格式的结构化数据,然后返回给客户端。

map类型

编程调用如下所示:

...
engine := gin.Default()
engine.GET("/hellojson", func(context *gin.Context) {
    fullPath := "请求路径:" + context.FullPath()
    fmt.Println(fullPath)

    context.JSON(200, map[string]interface{}{
        "code":    1,
        "message": "OK",
        "data":    fullPath,
    })
})
engine.Run(":9000") 

如上,调用JSON将map类型的数据转换成为json格式并返回给前端,第一个参数200表示设置请求返回的状态码。和http请求的状态码一致。

结构体类型

除了map以外,结构体也是可以直接转换为JSON格式进行返回的。结构体转换编程如下所示:

//通用请求返回结构体定义
type Response struct {
    Code    int         json:"code"
    Message string      json:"msg"
    Data    interface{} json:"data"
}

engine.GET("/jsonstruct", func(context *gin.Context) {
    fullPath := "请求路径:" + context.FullPath()
    fmt.Println(fullPath)
    resp := Response{Code: 1, Message: "Ok", Data: fullPath}
    context.JSON(200, &resp)
})

HTML模板

除了JSON格式以外,gin框架还支持返回HTML格式的数据。可以直接渲染HTML页面。举例如下:

...
engine := gin.Default()
//设置html的目录
engine.LoadHTMLGlob("./html/*")
engine.GET("/hellohtml", func(context *gin.Context) {
    fullPath := "请求路径:" + context.FullPath()

    context.HTML(http.StatusOK, "index.html", gin.H{
        "title":    "Gin教程",
        "fullpath": fullPath,
    })
})
engine.Run(":9000")

如上可以通过context.HTML来加载HTMl页面或者模板。同时需要在项目目录下有相应的html模板文件,如下所示:

    {{.title}}



Gin教程

{{.fullpath}}

加载静态资源文件

在上面的index.html的基础上,添加一张img进行展示。需要将img所在的目录进行静态资源路径设置才可能会生效,如下所示:

engine.Static("/img", "./img")Copy

在工程项目的根目录下创建img目录,用于存放静态的img资源。

同理,在项目开发时,一些静态的资源文件如html、js、css等可以通过静态资源文件设置的方式来进行设置。