Gin框架入门(四)—中间件

本文介绍了Gin框架中无中间件、默认中间件、自定义中间件、路由中间件、路由组中间件和全局中间件的使用方法,以及它们的执行顺序:全局中间件>路由组中间件>路由中间件。
摘要由CSDN通过智能技术生成

文档

官方文档:https://godoc.org/github.com/gin-gonic/gin
官方地址:https://github.com/gin-gonic/gin
中间件:https://gin-gonic.com/zh-cn/docs/examples/using-middleware

无中间件

func main() {
	//创建一个无中间件路由
	r := gin.New()
	r.Run()
}

默认中间件

func main() {
	// 默认启动方式,包含 Logger、Recovery 中间件
	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"middleware": "默认中间件",
		})
	})
	r.Run()
}

自定义中间件

func CustomRouterMiddle1(c *gin.Context) {
	t := time.Now()
	fmt.Println("start---我是自定义中间件第1种定义方式---请求之前")
	//在gin上下文中定义一个变量
	c.Set("example", "CustomRouterMiddle1")
	//请求之前
	c.Next()
	fmt.Println("end---我是自定义中间件第1种定义方式---请求之后")
	//请求之后,计算整个请求过程耗时
	t2 := time.Since(t)
	log.Println(t2)
}

func CustomRouterMiddle2() gin.HandlerFunc {
	return func(c *gin.Context) {
		t := time.Now()
		fmt.Println("start---我是自定义中间件第2种定义方式---请求之前")

		// 在gin上下文中设置 example 变量
		c.Set("example", "CustomRouterMiddle2")

		// 请求前
		c.Next()

		fmt.Println("end---我是自定义中间件第2种定义方式---请求之后")

		// 请求后
		t2 := time.Since(t)
		log.Print(t2)

	}
}
//自定义中间件
func mian() {
	r := gin.New()
	r.Use(CustomRouterMiddle1)
	//r.Use(CustomRouterMiddle2())

	r.GET("/test", func(c *gin.Context) {
		example := c.MustGet("example").(string)
		log.Println(example)
	})

	r.Run()
}

路由中间件

func RouterMiddle1(c *gin.Context) {
	c.String(http.StatusOK, "我是路由中间件1\n")
}

func RouterMiddle2(c *gin.Context) {
	c.String(http.StatusOK, "我是路由中间件2\n")
}

func RouterMiddleHandle() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.String(http.StatusOK, "我是业务处理函数\n")
	}
}

func main() {
	r := gin.New()
	//单个路由的中间件是可以添加多个的,并按照添加的函数顺序执行的
	r.GET("/testRouteMiddle", RouterMiddle1, RouterMiddle2, RouterMiddleHandle())
	r.Run()
}

在这里插入图片描述

从上图可以看出单个路由的中间件是可以添加多个的,并按照添加的函数顺序执行的。

路由组中间件

func GroupRouterMiddle1(c *gin.Context) {
	c.String(http.StatusOK, "我是路由组中间件1\n")
}

func GroupRouterMiddle2(c *gin.Context) {
	c.String(http.StatusOK, "我是路由组中间件2\n")
}

func main() {
	r := gin.New()
	articleGroup := r.Group("/article")
	articleGroup.Use(GroupRouterMiddle1, GroupRouterMiddle2)
	{
		articleGroup.GET("/add", func(c *gin.Context) {
			c.String(http.StatusOK, "/article/add")
		})

		articleGroup.GET("/del", func(c *gin.Context) {
			c.String(http.StatusOK, "/article/del")
		})

		//articleGroup下再嵌套一个testGroup
		testGroup := articleGroup.Group("/test", func(c *gin.Context) {
			c.String(http.StatusOK, "article/test下的中间件\n")
		})

		testGroup.GET("/test1", func(c *gin.Context) {
			c.String(http.StatusOK, "article/test/test1的函数")
		})
	}
	r.Run()
}

填写正确的路由组和路由,中间件先执行,并按照传入函数的顺序执行。
在这里插入图片描述
填写正确的路由组,错误的路由,中间件不执行,并返回404错误
在这里插入图片描述

全局中间件

func GlobalMiddle(c *gin.Context) {
	c.String(http.StatusOK, "我是全局中间件\n")
}

func main() {
	r := gin.New()
	//使用自定义的全局中间件
	r.Use(GlobalMiddle)
	
	r.GET("/testRouteMiddle", func(c *gin.Context) {
		c.String(http.StatusOK, "业务函数")
	})

	r.Run()
}

在这里插入图片描述

自定义中间件的执行顺序:全局中间件 > 路由组中间件 > 路由中间件

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在gin框架中接收POST请求并在请求到达处理程序之前进行中间件处理,可以使用gin中间件功能。以下是一个示例中间件,它可以将POST请求的请求体中的JSON解析为一个结构体,并将其绑定到请求的上下文中: ```go func JsonMiddleware() gin.HandlerFunc { return func(c *gin.Context) { if c.Request.Method == "POST" { var data interface{} err := c.BindJSON(&data) if err != nil { c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.Set("json_data", data) } c.Next() } } ``` 在这个中间件中,我们首先检查请求的HTTP方法是否为POST。如果是,我们尝试将请求体中的JSON解析为一个结构体。如果解析失败,我们返回一个HTTP 400错误响应,并终止请求。否则,我们将解析后的数据绑定到请求上下文的“json_data”键中,并继续处理请求。 要在gin应用程序中使用这个中间件,我们只需要在路由注册之前将其添加到应用程序的中间件链中: ```go router := gin.Default() router.Use(JsonMiddleware()) router.POST("/my-endpoint", func(c *gin.Context) { data := c.MustGet("json_data") // 处理请求数据 }) ``` 在这个示例中,我们使用gin.Default()创建一个新的路由器实例,并使用JsonMiddleware()函数添加一个中间件到路由器的中间件链中。然后,我们注册一个POST处理程序,该处理程序使用c.MustGet("json_data")从请求上下文中获取JSON解析后的数据,并对数据进行处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值