9_gin日拱一足---中间件

gin框架—中间件

中间件: gin框架允许开发者处理请求的过程中 加入自己的钩子函数(HOOK) 处理一些公共的逻辑

公共逻辑:登录认证 权限验证 数据分页 记录日志 耗时统计等等…

在这里插入图片描述

1.全局中间件

package main

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


//定义一个中间件
func MiddlerWare() gin.HandlerFunc {
	return func(c *gin.Context){
		t := time.Now()
		fmt.Println("中间件开始了!")
		//在Context中设置key-value
		c.Set("request","中间件")
		status := c.Writer.Status()					//返回当前请求的响应的状态码-->int
		fmt.Println("中间件执行完毕",status)
		t2 := time.Since(t)							//计算此时的时间和t时间之间的时间差--->Duration 等价于:time.Now().Sub(t)
		fmt.Println("time:",t2)
	}
}

func main() {
	//中间件
	r := gin.Default()
	//注册我们要使用的中间件(全局)
	r.Use(MiddlerWare())
	{
		r.GET("/chenjunde",func(c *gin.Context){
			//取出中间Set的值
			req , _ := c.Get("request")
			fmt.Println("request:",req)
			c.JSON(200,gin.H{"request": req})
		})
	}
	r.Run()
}
[GIN-debug] Listening and serving HTTP on :8080
中间件开始了!
中间件执行完毕 200
time: 1.0619ms
request: 中间件
[GIN] 2021/09/24 - 10:20:57 |?[97;42m 200 ?[0m|       2.099ms |       127.0.0.1 |?[97;44m GET     ?[0m "/chenjunde"
中间件开始了!
中间件执行完毕 404
time: 213µs

2.Next()函数的用法

在这里插入图片描述

package main

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


//定义一个中间件
func MiddlerWare() gin.HandlerFunc {
	return func(c *gin.Context){
		t := time.Now()
		fmt.Println("中间件开始了!")
		//在Context中设置key-value
		c.Set("request","中间件")
		//使用Next()函数跳转到后面的函数执行 
		c.Next()
		//后续函数执行完毕后继续执行像下面的代码
		status := c.Writer.Status()					//返回当前请求的响应的状态码-->int
		fmt.Println("中间件执行完毕",status)
		t2 := time.Since(t)							//计算此时的时间和t时间之间的时间差--->Duration 等价于:time.Now().Sub(t)
		fmt.Println("time:",t2)
	}
}
func main() {
	//中间件
	r := gin.Default()
	//注册我们要使用的中间件(全局)
	r.Use(MiddlerWare())
	{
		r.GET("/chenjunde",func(c *gin.Context){
			//取出中间Set的值
			req , _ := c.Get("request")
			fmt.Println("request:",req)
			c.JSON(200,gin.H{"request": req})
		})
	}
	r.Run()
}

3.About()函数

在这里插入图片描述

4.作用在特定的请求中的中间件(局部中间件)

只是特定的请求需要走中间件

package main

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


//定义一个中间件
func MiddlerWare() gin.HandlerFunc {
	return func(c *gin.Context){
		t := time.Now()
		fmt.Println("中间件开始了!")
		//在Context中设置key-value
		c.Set("request","中间件")
		//使用Next()函数跳转到后面的函数执行
		c.Next()
		//后续函数执行完毕后继续执行像下面的代码
		status := c.Writer.Status()					//返回当前请求的响应的状态码-->int
		fmt.Println("中间件执行完毕",status)
		t2 := time.Since(t)							//计算此时的时间和t时间之间的时间差--->Duration 等价于:time.Now().Sub(t)
		fmt.Println("time:",t2)
	}
}
func main() {
	//中间件
	r := gin.Default()
	//注册我们要使用的中间件(全局)
	r.GET("/chenjunde",MiddlerWare(),func(c *gin.Context){		// <-可以设置多个中间件
		//取出中间Set的值
		req , _ := c.Get("request")
		fmt.Println("request:",req)
		c.JSON(200,gin.H{"request": req})
	})
	r.Run()
}

5.中间件的练习

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"time"
)
//定义一个记录时间的中间件
func MiddlerWare() gin.HandlerFunc {
	return func(c *gin.Context){
		t := time.Now()			//当前时间
		fmt.Println("中间件开始记时")
		//Next函数执行下面HandlerFunc
		c.Next()
		time := time.Since(t)
		fmt.Println("用时:",time)
		fmt.Println("中间件执行完毕")
	}
}
func main() {
	//中间件
	r := gin.Default()
	//使用全局的中间件
	r.Use(MiddlerWare())
	//定义路由组
	g := r.Group("/chenjunde")
	{
		g.GET("/index",IndexFunc)
		g.GET("/login",LoginFunc)
	}
	r.Run()
}
func IndexFunc(c *gin.Context){
	time.Sleep(time.Second*3)
}
func LoginFunc(c *gin.Context){
	time.Sleep(time.Second*5)
}

返回的结果:

[GIN-debug] Listening and serving HTTP on :8080
中间件开始记时
用时: 5.0039974s
中间件执行完毕
中间件开始记时
用时: 3.0028899s
中间件执行完毕
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值