gin框架 中间件 Next()

gin 框架中间件处理有两个重要的函数 Next() 和 Abort()。

Next 函数会挂起当前所在的函数,然后调用后面的中间件,待后面中间件执行完毕后,再接着执行当前函数。

1. gin 中间件 Next() 的定义

gin 中间件 Next() 使用方法如下:

func (c *Context)Next()

比如:

func MiddleWare() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Next()
    }
}

2. gin 中间件 Next() 的范例

我们的案例中共有三个中间件,其中在中间件1中,调用了 Next 函数。

package main

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

// 定义中间件1
func MiddleWare1() gin.HandlerFunc {
    return func(c *gin.Context) {
        fmt.Println("调用中间件1")

        // 调用 Next,开始执行后续的中间件
        c.Next()

        fmt.Println("中间件继续执行")
    }
}

// 定义中间件2
func MiddleWare2() gin.HandlerFunc {
    return func(c *gin.Context) {
        fmt.Println("调用中间件2")
    }
}

// 定义中间件3
func MiddleWare3() gin.HandlerFunc {
    return func(c *gin.Context) {
        fmt.Println("调用中间件3")
    }
}

func main() {
    // 创建路由
    engine := gin.Default()

    // 注册中间件
    engine.Use(MiddleWare1(), MiddleWare2(), MiddleWare3())

    // 路由规则
    engine.GET("/", func(c *gin.Context) {
        fmt.Println("调用路由处理函数")
        // 页面接收
        c.JSON(200, gin.H{"request": "编程教程 gin框架"})
    })
    engine.Run()
}

运行程序,并在浏览器输入:http://localhost:8080,控制台日志会输出:

[GIN-debug] GET    /   --> main.main.func1 (4 handlers)
[GIN-debug] Listening and serving HTTP on :8080
调用中间件1
调用中间件2
调用中间件3
调用路由处理函数
中间件继续执行
[GIN] 2021/05/31 - 12:03:13 | 200 |  193.22µs | ::1 | GET "/"

以上输出显示:中间件1执行 Next 后,开始执行其他中间件,再执行页面处理函数。它们执行完毕后,又开始执行自己后续的代码。