Golang从入门到登堂20201121-gin框架学习文档(4)

五、 gin中间件

  • gin可以构建中间件,但它支对注册过的路由函数起作用
  • 对于分组路由,嵌套使用中间件,可以限定中间件的作用范围
  • 中间件分为全局中间件,单个路由中间件和群组中间件
  • gin中间件必须是一个 gin.HandlerFunc类型

1. 全局中间件

  • 所有的请求都经过该中间件
    关键函数: func middleWareXXX() gin.HandlerFunc{} c.Next()
    后台代码

    func main() {
    	//创建默认路由
    r := gin.Default()
    
    	r.Use(middleWare())
    	// {}为了规范代码
    	{
    		r.GET("/middleware", func(c *gin.Context) {
    			// 取值
    			req, _ := c.Get("request")
    		fmt.Println("request:", req)
    
    			c.JSON(http.StatusOK, gin.H{
    				"request": req,
    			})
    		})
    }
    
    	r.Run(":8000")
    }
    
    func middleWare() gin.HandlerFunc {
    	return func(c *gin.Context) {
    		t := time.Now()
    		fmt.Println("开始执行了...")
    		// 设置变量到Context的key中,可以通过Get()取
    		c.Set("request", "中间件")
    		// 执行函数
    		c.Next()
    		// 中间件执行完后续的一些事情
    		status := c.Writer.Status()
    		fmt.Println("中间件执行完毕", status)
    		t2 := time.Since(t)
    		fmt.Println("time: ", t2)
    	}
    }
    

2. Next()方法

  • 源码

    func (c *Context) Next() {
    	c.index++
    	for c.index < int8(len(c.handlers)) {
    		c.handlers[c.index](c)
    		c.index++
    	}
    }
    

3. 局部中间件

  • 只对当前的路由起作用
    后台代码

    r.GET("/middleware", middleWare(), func(c *gin.Context) {
    // 取值
    req, _ := c.Get("request")
    fmt.Println("request:", req)
    
    c.JSON(http.StatusOK, gin.H{
    	"request": req,
    })
    }
    

4. 中间件练习

  • 示例代码

    func middleWare() gin.HandlerFunc {
    	return func(c *gin.Context) {
    		t := time.Now()
    		c.Next()
    		t2 := time.Since(t)
    		fmt.Println("time: ", t2)
    	}
    }
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值