初探Gin | 青训营笔记

164 阅读3分钟

这是我参与「第三届青训营-后端场」笔记创作活动的的第3篇笔记

Go语言WEB框架(Gin)

Gin 是 Go语言写的一个 web 框架,要使用它,首先我们需要下载安装gin的包,下载包的命令为

go get github.com/gin-gonic/gin

下载完成后,让我们先写一个小的例子

import (
  "demo/src/main/routers"
  "github.com/gin-gonic/gin"
  "io"
  "net/http"
  "os"
)


func main() {
  r := gin.Default()
  r.GET("/hello", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "flag": true,
      "msg": "hello gin",
    })
  })
  r.Run(":81")
}

这里我们用gin框架的默认配置创建了一个路由。

我们来看下gin框架的一些简单配置。上面我们是用gin.Default()来创建路由的,下面我们用另一种方式来创建一个路由。

import (
  "demo/src/main/routers"
  "github.com/gin-gonic/gin"
  "io"
  "net/http"
  "os"
)


func main() {
  // 关闭控制台日志颜色
  gin.DisableConsoleColor()
  // 配置日志输出目录
  f, _ := os.Create("go.log")
  gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
  r := gin.New()
  // 使用log中间件
  r.Use(gin.Logger())
  r.GET("/hello", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "flag": true,
      "msg": "hello gin",
    })
  })
  r.Run(":81")
}

这次我们用gin.New()来创建路由,并配置了日志输出目录。

使用中间件

创建中间件

在 main 函数外新建一个中间件的自定义处理函数,这里示例为HandleRequest()

func HandleRequest() gin.HandlerFunc{
    return func(context *gin.Context) {
        // 中间件的处理部分
    }
}

这样就创建好了一个简单的 中间件 处理部分,这个处理部分在客户端请求的时候就会进行,而不是先执行操作
中间件的使用可以 只在请求时 加一级处理,也可以在路径访问 处理完毕后 再一级处理

使用中间件

中间件的使用可以全局使用,也可以指定某一个请求路径使用

全局使用

在创建的 gin 实例 engine 后面使用 engine.Use(中间件处理函数) 即可完成中间件的全局使用
全局使用的话任意路径的访问都会引用中间件
如上面我们已经定义了一个名为 HandleRequest() 的中间件处理函数,我们这样使用:

engine:=gin.Default()
engine.Use(HandleRequest()) // 使用中间件 

这样这个 go 文件运行时,其中编写的所有请求路径的请求都会通过中间件加一级处理

局部使用

假设,我们指定一个 GET 请求路径使用中间件时,原本代码为:

engine.GET("/hello", func(context *gin.Context) {
    // 处理部分
})

我们可以在 GET() 函数的 请求路径请求操作 处理的中间加上中间件处理函数名来指定某个请求路径使用中间件处理

engine.GET("/hello", HandleRequest(), func(context *gin.Context) {// 处理部分})

其他方式请求处理类似编写

示例

以下是一个小示例,这里请求返回的是一串 JSON 字符串,为了后面方便示例,这里先设置状态码为404

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
)

func main() {engine:=gin.Default()
    engine.Use(HandleRequest()) // 使用中间件
    engine.GET("/hello", func(context *gin.Context) {context.JSON(404,map[string]interface{}{
            "code":1,
            "msg":"ok",
        })
        fmt.Println("I am run")
    })
    engine.Run()}
func HandleRequest() gin.HandlerFunc{return func(context *gin.Context) {fmt.Println(" 请求路径 ",context.FullPath())
        fmt.Println(" 请求方式 ",context.Request.Method)
        fmt.Println(" 请求状态 ",context.Writer.Status())
    }
}

路径访问处理完毕后再一级处理

这时候在中间件加上 context.Next() 后即可实现在路径访问处理完毕后再加一级处理

engine.GET("/hello", func(context *gin.Context) {
    // 请求时处理部分
    context.Next()
    // 请求后处理后处理部分
})

示例

这里请求返回的是一串 JSON 字符串,为了方便示例,这里先设置状态码为404

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
)

func main() {engine:=gin.Default()
    engine.Use(HandleRequest()) // 使用中间件
    engine.GET("/hello", func(context *gin.Context) {context.JSON(404,map[string]interface{}{
            "code":1,
            "msg":"ok",
        })
        fmt.Println("I am run")
    })
    engine.Run()}
func HandleRequest() gin.HandlerFunc{return func(context *gin.Context) {fmt.Println(" 请求路径 ",context.FullPath())
        fmt.Println(" 请求方式 ",context.Request.Method)
        fmt.Println(" 请求状态 ",context.Writer.Status())

        context.Next()

        fmt.Println(" 请求路径 ",context.FullPath())
        fmt.Println(" 请求方式 ",context.Request.Method)
        fmt.Println(" 请求状态 ",context.Writer.Status())
    }
}

让我们来运行一下

浏览器访问后,正常状态码是 200
首先经过 中间件 处理,打印到控制台相关信息,其中状态码是 200
其次 进入 engine 实例 ,返回 JSON 请求并 使状态码变为 404 ,在控制台中打印 'I am run'
最后 返回中间件 ,打印到控制台相关信息。可以看到其中 状态码变为了 404