Golang Gin教程中间件编写指南

我正在学习Gin框架,看到官方的中间件文档有点不太理解具体实现方式。想请教大家几个问题:

  1. 如何正确编写一个基础的Gin中间件?
  2. 多个中间件串联使用时执行顺序是怎样的?
  3. 常见的中间件应用场景有哪些?比如日志记录、权限验证这些具体该怎么实现?
  4. 中间件中如何处理panic和错误比较规范?
3 回复

作为屌丝程序员,今天来聊聊Gin框架的中间件编写。

首先,中间件本质上是一个函数,接收两个参数:上下文对象c和下一个处理函数next。结构如下:

func MyMiddleware(c *gin.Context) {
    // 在请求之前执行的逻辑
    fmt.Println("Before request")

    // 调用下一个处理函数
    c.Next()

    // 在请求之后执行的逻辑
    fmt.Println("After request")
}

注册中间件时,使用Use方法:

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

进阶写法可以带参数,比如日志记录器:

func Logger(param string) gin.HandlerFunc {
    return func(c *gin.Context) {
        start := time.Now()
        c.Next()
        elapsed := time.Since(start)
        fmt.Printf("Request took %v, param: %s\n", elapsed, param)
    }
}

router.Use(Logger("test"))

注意:中间件执行顺序与注册顺序一致,先注册的先执行。如果中间件调用c.Abort(),则后续中间件和路由处理函数不会被执行。

掌握这些基本技巧,就可以写出功能丰富的中间件了!

更多关于Golang Gin教程中间件编写指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


作为一个屌丝程序员,我来简单分享下Gin框架中如何编写自定义中间件。

首先,在Gin中,中间件就是一个普通的函数,接收一个gin.Context对象作为参数,并且返回void。比如:

func MyMiddleware(c *gin.Context) {
    fmt.Println("Middleware running")
    c.Next()
}

然后在初始化路由时,将这个中间件注册到引擎上:

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

如果你想给特定路由添加中间件,可以这样做:

group := router.Group("/api")
group.Use(MyMiddleware)
group.GET("/test", func(c *gin.Context) {
    c.JSON(200, gin.H{"msg": "OK"})
})

需要注意的是,中间件执行顺序是先进后出(类似栈的结构),所以先定义的中间件会比后定义的先执行。

此外,为了提高性能,可以在中间件中进行请求过滤和资源缓存。比如记录访问日志、权限校验等。记得在最后调用c.Next()让请求继续往下走哦!

Gin框架中间件编写指南

Gin中间件是处理HTTP请求和响应的重要机制,位于客户端请求和最终处理逻辑之间。以下是编写Gin中间件的核心要点:

基本中间件结构

func MyMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        // 请求处理前的逻辑
        start := time.Now()
        
        // 调用下一个处理程序
        c.Next()
        
        // 请求处理后的逻辑
        latency := time.Since(start)
        log.Printf("请求耗时: %v", latency)
    }
}

中间件使用方式

router := gin.Default()

// 全局中间件
router.Use(MyMiddleware())

// 路由组中间件
api := router.Group("/api")
api.Use(AuthMiddleware())
{
    api.GET("/users", GetUsers)
}

// 单个路由中间件
router.GET("/profile", AuthMiddleware(), GetProfile)

常用中间件示例

  1. 认证中间件
func AuthMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        token := c.GetHeader("Authorization")
        if token != "valid_token" {
            c.AbortWithStatusJSON(401, gin.H{"error": "未授权"})
            return
        }
        c.Next()
    }
}
  1. 日志中间件
func LoggerMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        start := time.Now()
        c.Next()
        log.Printf("[%s] %s %s %v",
            c.Request.Method,
            c.Request.URL.Path,
            c.ClientIP(),
            time.Since(start))
    }
}
  1. 错误处理中间件
func RecoveryMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        defer func() {
            if err := recover(); err != nil {
                c.JSON(500, gin.H{"error": "服务器内部错误"})
                c.Abort()
            }
        }()
        c.Next()
    }
}

注意事项

  1. 中间件按Use()顺序执行,Next()前的代码按顺序执行,Next()后的代码逆序执行
  2. 使用c.Abort()可以中断中间件链
  3. 中间件可以修改请求和响应,但要谨慎操作
  4. 避免在中间件中进行耗时操作,以免影响性能
回到顶部