使用中间件

很多Web框架都有MiddleWare(中间件)的概念,Gin框架中的中间件能在具体的处理函数执行前和执行后运行一些代码逻辑。中间件可以实现统一的认证鉴权、日志记录、请求信息统计等功能。Gin提供了一些内置的中间件,很多Gin的扩展都是使用中间件实现的,我们具体开发时很多业务逻辑也需要我们自定义中间件。

Gin的内置中间件

前面我们编写的代码中都用到了gin.Default()来初始化Gin框架,实际上这个Default()方法就会加载2个默认的中间件:Logger和Recovery。

  • Logger:内置中间件,用于写日志到控制台
  • Recovery:用于处理panic,Gin服务端程序发生panic错误时会被该中间件recover并返回500响应码,而不是直接终止进程

自定义中间件

下面例子中我们自定义了一个DemoMiddleWare,它在具体的处理函数执行前后打印了一些信息。

package main

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

func DemoMiddleWare(context *gin.Context) {
    fmt.Println("处理函数执行前")
    context.Next()
    fmt.Println("处理函数执行后")
}

func main() {
    engine := gin.Default()

    engine.GET("/", DemoMiddleWare, func(context *gin.Context) {
        fmt.Println("处理函数执行了")
    })

    err := engine.Run(":8080")
    if err != nil {
        fmt.Println(err)
        return
    }
}

我们可以发现,其实处理函数和中间件都是gin.HandlerFunc类型的,只不过它们逻辑上的作用位置不同,中间件是可复用的,可以配置在全局、路由组或是某些路由上,而处理函数一般对应一个路由。

中间件的代码中,我们调用了context.Next()方法,它代表其它处理逻辑的执行,以此实现在处理函数后插入逻辑;此外中间件里还可以使用Abort()方法终止后续处理,用于例如权限验证不通过这类需求场景。

中间件的配置位置

中间件可以配置为全局、路由组和路由上生效。

配置为全局中间件例子如下:

engine.Use(DemoMiddleWare)

配置为路由组中间件例子如下:

group := engine.Group("/api/v1", DemoMiddleWare)

配置为路由中间件例子如下:

engine.GET("/", DemoMiddleWare, func(context *gin.Context) {}
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap