Golang Gin框架 中间件(一)中间件解析

中间件解析

每个中间件是独立的,可以多个中间件组成一个链状的结构,让request请求流水线般的进行拦截处理。

Gin框架运行过程图.png

除了内置的中间件r := gin.Default()中的日志中间件Logger() 和 恢复错误现场中间件Recovery()之外,还可以自定义中间件,比如:

func TimeCostMiddleware(c *gin.Context)  {
	t := time.Now()
	//请求之前
	c.Next() //处理请求
	//请求之后
	//计算整个请求过程耗时
	t2 := time.Since(t)
	log.Println(t2)
}

按类型分为全局中间件和局部中间件

  • 注册为全局中间件,使用func (engine *Engine) Use(middleware ...HandlerFunc),同时也能使用该函数对路由组进行注册;
package main

import (
   "github.com/gin-gonic/gin"
   "log"
   "net/http"
   "time"
)

func main() {
   r := gin.Default()
   r.Use(TimeCostMiddleware) //使用Use进行全局中间件的注册
   r.GET("/hello", func(c *gin.Context) {
      c.JSON(http.StatusOK, gin.H{
         "message": "hello",
      })
   })
   _ = r.Run(":8080")
}
func TimeCostMiddleware(c *gin.Context)  {
   t := time.Now()
   //请求之前
   c.Next() //处理请求
   //请求之后
   //计算整个请求过程耗时
   t2 := time.Since(t)
   log.Println("耗时", t2)
}
2021/09/01 11:37:33 耗时 0s
[GIN] 2021/09/01 - 11:37:33 |?[97;42m 200 ?[0m|          26ms |             ::1 |?[97;44m GET     ?[0m "/hello"
  • 注册为局部中间件,直接写入函数入口参数中,中间件的本质也是HandlerFunc,同时对路由组也能写入入口参数中也能实现这个效果:
package main

import (
   "github.com/gin-gonic/gin"
   "log"
   "net/http"
   "time"
)

func main() {
   r := gin.Default()
   r.GET("/hello", TimeCostMiddleware, func(c *gin.Context) { //写入入口参数中进行局部中间件的注册
      c.JSON(http.StatusOK, gin.H{
         "message": "hello",
      })
   })
   _ = r.Run(":8080")
}
func TimeCostMiddleware(c *gin.Context)  {
   t := time.Now()
   //请求之前
   c.Next() //处理请求
   //请求之后
   //计算整个请求过程耗时
   t2 := time.Since(t)
   log.Println("耗时", t2)
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值