Skip to main content

Middleware

中间件可以理解为函数串中间某个函数。

func m1(c *gin.Context) {
// todo1
c.Next()
// todo2
}

func m2(c *gin.Context) {
// todo3
c.Next()
// todo4
}

func m3(c *gin.Context) {
// todo5
c.Next()
// todo6
}

Next是下一个中间函数的引用,如上的执行顺序为:

todo1 -> todo3 -> todo5 -> todo6 -> todo4 -> todo2

基本形式

中间件函数的一般形式是:一个函数返回返回一个中间件函数,其主要是为了可能的参数的传递。

func m1() gin.HandlerFunc {
return func(ctx *gin.Context) {
ctx.Next()
}
}

使用中间件

gin中,可使用上下文的Use方法注册中间件,其会在访问每个接口之前调用这些中间件函数。

func main() {
r := gin.Default()
r.Use(m1())

r.GET("/test", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, nil)
})

r.Run()
}

此外,还可对对特定的接口单独设置中间件,只在调用该接口时生效:

r.GET("/test", m1(), func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, nil)
})

Next

调用Next方法可暂停当前中间件函数执行,执行下一个中间件。但Next方法并不决定中间件是否继续往下执行,在不手动调用Next的情况下,中间件也会继续往下执行。

Abort

Abort方法可终止下一个中间件执行:

func m1(c *gin.Context) {
// todo1
c.Next()
// todo2
}

func m2(c *gin.Context) {
// todo3
c.Abort()
// todo4
}

func m3(c *gin.Context) {
// todo5
c.Next()
// todo6
}

/*
todo1
todo3
todo4
todo2
*/

在中间件函数中如果使用了return语句,不再执行当前中间后续的程序,但并不会影响后续中间件的执行:

func m1(c *gin.Context) {
// todo1
c.Next()
// todo2
}

func m2(c *gin.Context) {
// todo3
return
// todo4
}

func m3(c *gin.Context) {
// todo5
c.Next()
// todo6
}

/*
todo1
todo3
todo5
todo6
todo2
*/