Gin 框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函 数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、 记录日志、耗时统计等。

中间件查看系统调用函数时间

c.Next()可以在路由匹配完成后执行一些操作 ps. c.Abort() 表示终止调用该请求的剩余处理程序

package routers

import (
    "fmt"
    "time"

    "github.com/gin-gonic/gin"
)

func initMiddleware(c *gin.Context) {
    start := time.Now().UnixNano()
    fmt.Println("i'm middle")
    c.Next()
    end := time.Now().UnixNano()
    fmt.Println(end - start)
}

func DefaultRoutersInit(r *gin.Engine) {
    defaultRouters := r.Group("/")
    {
        defaultRouters.GET("/", initMiddleware, func(c *gin.Context) {
            c.String(200, "right")
            time.Sleep(time.Second)
        })
        defaultRouters.GET("/news", initMiddleware, func(c *gin.Context) {
            c.String(200, "新闻")
        })
    }
}

类型断言

package middlewares

import (
    "fmt"
    "time"

    "github.com/gin-gonic/gin"
)
func InitMiddleware(c *gin.Context) {
    fmt.Println(time.Now())
    fmt.Println(c.Request.URL)
    c.Set("username", "123")
}
func (con ArticleController) Add(c *gin.Context) {
    username, _ := c.Get("username")
    //类型断言
    v, ok := username.(string)
    if ok == true {
        c.String(200, "文章列表-add"+v)
    } else {
        c.String(200, "文章列表-获取失败")
    }
    fmt.Println(username)
}

中间件注意事项 gin 默认中间件 gin.Default()默认使用了 Logger 和 Recovery 中间件,其中: • Logger 中间件将日志写入 gin.DefaultWriter,即使配置了GIN_MODE=release。 • Recovery 中间件会 recover 任何 panic。如果有 panic 的话,会写入 500 响应码。 如果不想使用上面两个默认的中间件,可以使用 gin.New()新建一个没有任何默认中间件的路由。 gin中间件中使用 goroutine 当在中间件或 handler 中启动新的 goroutine 时,不能使用原始的上下文(c *gin.Context), 必须使用其只读副本(c.Copy())

func InitMiddleware(c *gin.Context) {
    fmt.Println(time.Now())
    fmt.Println(c.Request.URL)
    c.Set("username", "123")
    cCp := c.Copy()
    go func() {
        time.Sleep(2 * time.Second)
        fmt.Println(cCp.Request.URL.Path)
    }()

}