gin基础学习笔记(六)-gin中间件

1、全局中间件

所有的请求先经过此中间件

在Gin框架中,中间件(Middleware)是一种机制,用于在请求到达路由处理函数之前或之后执行一些通用的逻辑。中间件可以对HTTP请求进行预处理、后处理或者进行一些额外的操作,例如身份验证、日志记录、错误处理、性能监控等。中间件的作用包括但不限于以下几点:

  1. 身份验证和授权 中间件可以用于验证用户身份、检查权限,确保只有经过授权的用户可以访问特定的路由或资源。

  2. 日志记录: 中间件可以记录请求的信息,如请求路径、请求方法、请求参数等,以便进行日志记录和监控。

  3. 错误处理: 中间件可以捕获请求处理过程中的错误,进行统一的错误处理和返回错误信息给客户端。

  4. 性能监控 中间件可以用于监控请求的处理时间、请求次数等性能指标,帮助开发者进行性能优化。

  5. 请求预处理: 中间件可以在请求到达路由处理函数之前对请求进行预处理,如解析请求参数、设置一些公共的请求头等。

  6. 响应后处理: 中间件可以在路由处理函数处理完请求后对响应进行处理,如设置响应头、压缩响应数据等。

通过使用中间件,可以将通用的逻辑从具体的路由处理函数中分离出来,提高代码的可维护性和复用性。在Gin框架中,可以通过注册中间件来实现上述功能,使得开发者能够更加灵活地处理HTTP请求,并且可以实现一些全局的功能,而不需要在每个路由处理函数中重复编写相同的逻辑。

 

package main

import (
	"fmt"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
)

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

	}
}

func main() {

	r := gin.Default()
	// 注册中间件
	r.Use(MiddleWare())
	// 为了规范加了{}
	{
		r.GET("/middleTest", func(ctx *gin.Context) {
			// 取值
			req, _ := ctx.Get("request")
			fmt.Println("request", req)
			// JSON数据返回到页面
			ctx.JSON(http.StatusOK, gin.H{"request": req})
		})
	}

	r.Run()
}

对于上述code做了些改动,测试中间件函数的运行是在请求到达之前还是到达之后
 

package main

import (
	"fmt"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
)

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

	}
}

func main() {

	r := gin.Default()
	// 注册中间件
	r.Use(MiddleWare())
	// 为了规范加了{}
	{
		r.GET("/middleTest", func(ctx *gin.Context) {
			// 取值
			start := time.Now()
			req, _ := ctx.Get("request")
			fmt.Println("request", req)
			// JSON数据返回到页面
			ctx.JSON(http.StatusOK, gin.H{"request": req, "time": start})
		})
	}

	r.Run()
}

可以看出中间件执行时间提前

2、Next方法

在Gin框架中,Next方法是用于在中间件函数中调用下一个中间件或路由处理函数的方法。当一个请求到达时,Gin框架会按照注册的顺序依次执行各个中间件函数,而Next方法则用于在当前中间件函数中调用下一个中间件函数或路由处理函数。

在中间件函数中调用Next方法的作用是将控制权交给下一个中间件或路由处理函数,使得下一个中间件或路由处理函数能够继续处理请求。这样可以实现中间件链式调用的效果,每个中间件函数在处理完自己的逻辑之后,通过调用Next方法将请求传递给下一个中间件或路由处理函数,直到所有中间件函数都执行完毕,最终到达路由处理函数。

 流程

 

package main

import (
	"fmt"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
)

func MiddleWare() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		t := time.Now()
		fmt.Println("中间件开始执行了")
		// 设置变量到Context的key中,可以用通过Get()获取
		ctx.Set("request", t)
		// 调用Next方法将控制权交给下一个中间件或路由处理函数
		ctx.Next()

		// 在Next方法之后的代码将在下一个中间件或路由处理函数执行完后执行
		status := ctx.Writer.Status()
		fmt.Println("中间件执行完毕", status)
		t2 := time.Since(t)
		fmt.Println("time", t2)

	}
}

func main() {

	r := gin.Default()
	// 注册中间件
	r.Use(MiddleWare())
	// 为了规范加了{}
	{
		r.GET("/middleTest", func(ctx *gin.Context) {
			// 取值
			start := time.Now()
			req, _ := ctx.Get("request")
			fmt.Println("request", req)
			// JSON数据返回到页面
			ctx.JSON(http.StatusOK, gin.H{"request": req, "time": start})
		})
	}

	r.Run()
}

 相比上一个没有Next函数的,中间件的执行执行时间增加

3、局部中间件的使用

// 局部中间件的使用
	r.GET("/ce", MiddleWare(), func(ctx *gin.Context) {
		req, _ := ctx.Get("request")
		ctx.JSON(200, gin.H{"request": req})
	})

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值