gin框架中的中间件

全局中间件

所有请求都经过此中间件

  1. 中间件中设置值
func MiddleWare() gin.HandlerFunc {
	return func(context *gin.Context) {
		t := time.Now()
		fmt.Println("中间件开始执行了")
		// 设置变量到Context的key中,可以通过Get获取
		context.Set("request", "中间件")
		status := context.Writer.Status()
		fmt.Println("中间件执行完毕", status)
		t2 := time.Since(t)
		fmt.Println("time: ", t2)
	}
}
  1. 处理方法中取值
func middleHello(context *gin.Context) {
	// 从中间件设置的变量中取值
	value, ok := context.Get("request")
	if ok {
		fmt.Println(value)
	}
	context.JSON(http.StatusOK, gin.H{"request": value})
}

输出结果:

中间件开始执行了
中间件执行完毕 200
time:  0s
中间件

注意: 请注意黑色的数据里面有一步算时间差没有执行(需要学习Next就懂了)

context.Next()方法

func MiddleWare() gin.HandlerFunc {
	return func(context *gin.Context) {
		t := time.Now()
		fmt.Println("中间件开始执行了")
		// 设置变量到Context的key中,可以通过Get获取
		context.Set("request", "中间件")
		status := context.Writer.Status()
		fmt.Println("中间件执行完毕", status)

		// 请求前执行
		context.Next()
		// 请求后执行

		t2 := time.Since(t)  // 计算函数处理请求时间
		fmt.Println("time: ", t2)
	}
}

执行结果:

中间件开始执行了
中间件执行完毕 200
中间件
time:  1.014342s

路由组使用中间件

`adminRouterGroup.Use(middleware.MiddleWare())

局部中间件

router.GET("/middle-hello", middleware.MiddleWare(), middleHello)

中间件练习

定义程序计时中间件,然后定义2个路由,执行函数后应该打印统计的执行时间,如下:

  1. 自定义程序耗时中间件
func MyTime() gin.HandlerFunc {
	return func(context *gin.Context) {
		startTime := time.Now()
		context.Next()
		d := time.Since(startTime)
		fmt.Println("程序耗时:", d)
	}
}

请求两个路由执行结果:

程序耗时: 3.0023744s
[GIN] 2021/12/10 - 10:54:26 | 200 |    3.0029489s |       127.0.0.1 | GET      "/admin/shop"
程序耗时: 1.0132144s
[GIN] 2021/12/10 - 10:54:37 | 200 |    1.0132144s |       127.0.0.1 | GET      "/middle-hello"

中间件推荐


github链接

posted @ 2021-12-10 11:20  专职  阅读(204)  评论(0编辑  收藏  举报