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

文档

官方文档: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()
}

在这里插入图片描述

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

相关推荐

  1. Gin框架: 控制器, 中间的分层设计案例

    2024-04-28 16:44:06       23 阅读
  2. gin自定义中间

    2024-04-28 16:44:06       13 阅读
  3. Go(gin框架

    2024-04-28 16:44:06       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-28 16:44:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-28 16:44:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-28 16:44:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-28 16:44:06       20 阅读

热门阅读

  1. 字节跳动高频题目(1)

    2024-04-28 16:44:06       13 阅读
  2. Go语言结构体

    2024-04-28 16:44:06       8 阅读
  3. go 映射(Map)使用注意事项

    2024-04-28 16:44:06       12 阅读
  4. 【MySQL】——用户和权限管理(一)

    2024-04-28 16:44:06       9 阅读
  5. 「PHP系列」PHP 发送电子邮件详解

    2024-04-28 16:44:06       14 阅读
  6. uniapp 基础阿里云点播 使用

    2024-04-28 16:44:06       11 阅读
  7. Es6和Es5的区别?

    2024-04-28 16:44:06       11 阅读
  8. php 手机号加星号

    2024-04-28 16:44:06       11 阅读
  9. 什么是CDA数据分析师认证考试?

    2024-04-28 16:44:06       27 阅读