Fork me on GitHub

Gin框架系列之中间件基础

一、什么是中间件

开发者自定义的一些钩子函数,用于请求到达不同的地方进行拦截,做一些处理,比如:

  • 登陆之前进行拦截,判断请求是否携带token
  • 登陆之后进行权限校验
  • 限流

...

二、中间件的简单使用

如下:

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {

    router := gin.Default()

    router.GET("/login", Login)

    router.Run(":8080")

}

func Login(context *gin.Context) {
    context.String(http.StatusOK, "登陆!")
}

当我们访问:http://127.0.0.1:8080/login,会响应我们对应的信息,但是后台会打印很多的日志,这是为什么呢?因为已经内置了日志相关的中间件。在:

...
router := gin.Default()
...

的源码中:

// Default returns an Engine instance with the Logger and Recovery middleware already attached.
func Default() *Engine {
    debugPrintWARNINGDefault()
    engine := New()
    engine.Use(Logger(), Recovery())
    return engine
}

通过Use方法来加载Logger中间件。

如果不想添加任何中间件,可以通过这种方式创建路由:

...
router := gin.New()
...

三、中间件注意事项

 中间件处于不同的位置,执行的位置也是不同,比如上面内置的2个中间件就是会在路由匹配之前运行。而下面这个:

...
router := gin.New()
router.GET("/login", Login)
router.Use(MiddleWare())
router.GET("/home", Home)
...

显然在login后执行中间件,对进入home主页的路由进行校验。

如果有多个中间件应该如何执行呢?

package main

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

func MiddlewareA() gin.HandlerFunc {
    return func(context *gin.Context) {
        fmt.Println("MiddlewareA before request")
        // before request
        context.Next()
        // after request
        fmt.Println("MiddlewareA after request")
    }
}

func MiddlewareB() gin.HandlerFunc {
    return func(context *gin.Context) {
        fmt.Println("MiddlewareB before request")
        // before request
        context.Next()
        // after request
        fmt.Println("MiddlewareB after request")
    }
}

func main()  {

    router := gin.Default()

    router.GET("/login", Login)
    router.Use(MiddlewareA(), MiddlewareB())

    router.Run(":8080")

}

func Login(context *gin.Context) {
    context.String(http.StatusOK, "登陆!")
}

上面有2个中间件A和B,当我们访问路由"/login"后,会出现如下的打印:

MiddlewareA before request
MiddlewareB before request
MiddlewareB after request
MiddlewareA after request

从这里可以看到中间件的执行特点。

 

posted @ 2022-05-04 16:25  iveBoy  阅读(158)  评论(0编辑  收藏  举报
TOP