33a55297d5f1966fafc89706d833e611
Gin(七):中间件的使用和定义

中间件 middlewaregolang 中是一个很重要的概念,与 java 中拦截器很相似。通过 gin 源代码来看看中间件代码使用。

🎮中间件使用

我们还是回到了 initRouterSetupRouter 这个方法。

router := gin.Default()

我们的项目是从这一行代码开始的,所以我们看看这一行代码做了些什么。打开 Default 源码,

func Default() *Engine {
    debugPrintWARNINGDefault()
    engine := New()
    engine.Use(Logger(), Recovery())
    return engine
}

源码中,首先是 New 了一个 engine ,紧接着通过 Use 方法,传入了 Logger()Recovery() ,而 LoggerRecovery 就是两个中间件。

其中 Logger 是对日志进行记录,而 Recovery 是对有 painc时, 进行 500 的错误处理

查看了源码之后,那么我们也就知道如何使用中间件了。

📝自定义一个中间件

中间件需要返回 gin.HandlerFunc 函数,所以定义返回函数。

而且 中间件有个 Next 函数,在我们定义的众多中间件,会形成一条中间件链,而通过 Next 函数来对后面的中间件进行执行。Next 函数是在请求前执行,而 Next 函数后是在请求后执行。

我们来自己定义一个 Logger 日志,新建一个 middleware 文件夹,里面新建 Logger.go,进行我们自定义的日志展示。

package middleware

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

func Logger() gin.HandlerFunc {
    return func(context *gin.Context) {
        host := context.Request.Host
        url := context.Request.URL
        method := context.Request.Method
        fmt.Printf("%s::%s \t %s \t %s ", time.Now().Format("2006-01-02 15:04:05"), host, url, method)
        context.Next()
        fmt.Println(context.Writer.Status())
    }
}
top Created with Sketch.