文档
官方文档: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下再嵌套一个testGrouptestGroup := 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()
}
自定义中间件的执行顺序:全局中间件 > 路由组中间件 > 路由中间件