go从0到1项目实战体系四十一:全局中间件

. 对于分组路由,嵌套使用中间件,可以限定中间件的作用范围.. 中间件:
   a. 全局中间件
   b. 单个路由中间件
   c. 群组中间件

(1). Context是Gin的核⼼:

type Context struct {
    writermem responseWriter
    Request   *http.Request
    Writer    ResponseWriter
    Params   Params
    handlers HandlersChain
    index    int8
    engine   *Engine
    Keys     map[string]interface{}
    Errors   errorMsgs
    Accepted []string
}

// HandlersChain defines a HandlerFunc array.
type HandlersChain []HandlerFunc

// HandlerFunc defines the handler used by gin middleware as return value.
type HandlerFunc func(*Context):. 上面可以看出中间件和普通的HandlerFunc没有任何区别.
func MiddleWare() gin.HandlerFunc {
   // 返回一个闭包
   return func(c *gin.Context) {
      t := time.Now()
      fmt.Println("before middleware")
      // 设置request变量到Context的Key中,通过Get等函数可以取得
      c.Set("request", "client_request")
      // 发送request之前
      c.Next()
      // 函数处理之后做一些操作
      // 发送requst之后
      // 这个c.Write是ResponseWriter,可以获得状态等信息
      status := c.Writer.Status()
      fmt.Println("after middleware", status)
      t2 := time.Since(t)
      fmt.Println("time:", t2)
   }
}

// 使⽤router装饰中间件
router.Use(MiddleWare())
{
   // 后面的路由处理器,可以根据被中间件装饰后提取其值
   // ①. 当请求路由时,会执行MiddleWare(),在GET注册的时,同时注册了匿名函数.
   router.GET("/middleware", func(c *gin.Context) {
      ...
   })
}

(1). 说明:

. 只会给c上下文添加一个属性,并赋值.. 规则:
   a. 注册中间件之前的路由,不会受到中间件影响.
   b. 只有注册中间件以下代码的路由函数规则,才会被中间件装饰.. 花括号:
   a. 使用花括号包含被装饰的路由函数只是一个代码规范.
   b. 即使没有被包含在内的路由函数,只要使用router进行路由,都会被装饰.
   c. 想要区分权限范围,可以使用组返回的对象注册中间件.

(2). 闭包:

. 直接使用业务逻辑:
   func MiddleWare(c *gin.Context) gin.HandlerFunc {
      // 业务逻辑
      ...
   }
   router.GET("/home", MiddleWare, func(c *gin.Context) {
      ...
   }). 返回一个闭包:
   // 好处是能够包含外部作用域变量的引用,可以做一些定制化的操作.
   func MiddleWare(debug bool) gin.HandlerFunc {
      // 返回一个闭包
      return func(c *gin.Context) {
         // 业务逻辑
         ...
         if (debug) {
            ...
         }
      }
   }
   router.GET("/home", MiddleWare(true), func(c *gin.Context) {
      ...
   })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值