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