1. 前言

中间件在实际业务上出现是很常见,在一些权限处理、日志记录、给接口设置参数等,使用中间件,就可以在请求和响应之间做数据处理、业务逻辑验证等。
业务实现逻辑在routers/middleware.go

2. 注册全局中间件

顾名思义,全局就是在这个范围内的请求都会受这个逻辑影响。

package routers

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

// 中间件常用
func MiddlewareRouter(e *gin.Engine) {

    // 注册全局中间件 (测试其它时注释)
    e.Use(global())

    // 使用路由组
    r := e.Group("/middleware")

    // 注册全局中间件
    r.GET("/global", func(c *gin.Context) {
        // 取值
        req, _ := c.Get("user_id")
        fmt.Println("用户ID:", req)
        // 页面接收
        c.JSON(200, gin.H{"user_id": req})
    })
}

// 全局中间件
func global() gin.HandlerFunc {
    return func(c *gin.Context) {
        t := time.Now()
        fmt.Println("middleware begin")
        // 设置变量到Context的key中,可以通过Get()取,如现实项目通常会设置用户id
        c.Set("user_id", 9527)
        status := c.Writer.Status()
        fmt.Println("middleware end", status)
        t2 := time.Since(t)
        fmt.Println("time:", t2)
    }
}

http://127.0.0.1:8080/middleware/global

3. 注册局部中间键

局部就是给给别使用,看下面代码可知 next是放在local r.GET()里面的,不会影响到其它请求。

package routers

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

// 中间件常用
func MiddlewareRouter(e *gin.Engine) {

    // 注册中间件next() (测试其它时注释)
    e.Use(next())

    // 使用路由组
    r := e.Group("/middleware")

    //局部中间键使用(个别路由可用)
    r.GET("/local", next(), func(c *gin.Context) {
        // 取值
        req, _ := c.Get("user_id")
        fmt.Println("user_id:", req)
        // 页面接收
        c.JSON(200, gin.H{"user_id": req})
    })

}

// Next()方法  curl 127.0.0.1:8080/middleware/global
func next() gin.HandlerFunc {
    return func(c *gin.Context) {
        t := time.Now()
        fmt.Println("middleware-next begin")
        // 设置变量到Context的key中,可以通过Get()取,如现实项目通常会设置用户id
        c.Set("user_id", 9527)
        // 执行函数
        c.Next()
        // 中间件执行完后续的一些事情
        status := c.Writer.Status()
        fmt.Println("middleware-next end", status)
        t2 := time.Since(t)
        fmt.Println("执行时间:", t2)
    }
}
Copyright © yzx该文章修订时间: 2021-09-09 15:15:57

results matching ""

    No results matching ""