中间件
gin
中间件和Koa的中间件思想一致,都是洋葱模型
使用
ctx.Next
方法表示调用下一个中间件使用
ctx.Abort
方法表示阻断当前中间件之后的其他中间件执行
单个路由中间件
Go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func user1(ctx *gin.Context) {
fmt.Println("进入user1")
ctx.Next()
fmt.Println("退出user1")
}
func user2(ctx *gin.Context) {
fmt.Println("进入user2")
ctx.Next()
fmt.Println("退出user2")
}
func user(ctx *gin.Context) {
fmt.Println("进入user")
ctx.Next()
fmt.Println("退出user")
}
func main() {
router := gin.Default()
// 单个路由中间件
router.GET("/user", user1, user2, user)
router.Run(":9100")
}
访问/user结果如下
Go
进入user1
进入user2
进入user
退出user
退出user2
退出user1
阻断中间件继续执行
- 使用
ctx.Abort
方法`
Go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func user1(ctx *gin.Context) {
fmt.Println("进入user1")
ctx.Next()
fmt.Println("退出user1")
}
func user2(ctx *gin.Context) {
fmt.Println("进入user2")
ctx.Abort()
fmt.Println("退出user2")
}
func user(ctx *gin.Context) {
fmt.Println("进入user")
ctx.Next()
fmt.Println("退出user")
}
func main() {
router := gin.Default()
// 单个路由中间件
router.GET("/user", user1, user2, user)
router.Run(":9100")
}
访问/user结果如下
Go
进入user1
进入user2
退出user2
退出user1
全局中间件
- 使用
router.User
注册全局中间件
Go
func globalMiddleware(ctx *gin.Context) {
fmt.Println("进入globalMiddleware")
ctx.Next()
fmt.Println("退出globalMiddleware")
}
func userHanlder(ctx *gin.Context) {
fmt.Println("userHanlder")
}
func articleHanlder(ctx *gin.Context) {
fmt.Println("articleHanlder")
}
func main() {
router := gin.Default()
router.Use(globalMiddleware)
// 单个路由中间件
// router.GET("/user", user1, user2, user)
router.GET("/user", userHanlder)
router.GET("/article", articleHanlder)
router.Run(":9100")
}
访问
/user
、/article
Go
进入globalMiddleware
userHanlder
退出globalMiddleware
进入globalMiddleware
articleHanlder
退出globalMiddleware
分组路由中间件
Go
func globalMiddleware(ctx *gin.Context) {
fmt.Println("进入globalMiddleware")
ctx.Next()
fmt.Println("退出globalMiddleware")
}
func v1Middleware(ctx *gin.Context) {
fmt.Println("进入v1Middleware")
ctx.Next()
fmt.Println("退出v1Middleware")
}
func tagsHanlder(ctx *gin.Context) {
fmt.Println("tagsHanlder")
}
func main() {
router := gin.Default()
router.Use(globalMiddleware)
v1Gorup := router.Group("/v1")
// 注册v1中间件
v1Gorup.Use(v1Middleware)
{
v1Gorup.GET("/tags", tagsHanlder)
}
v2Gorup := router.Group("/v2")
{
v2Gorup.GET("/tags", tagsHanlder)
}
router.Run(":9100")
}
访问
/v1/tags
打印如下
Go
进入globalMiddleware
进入v1Middleware
tagsHanlder
退出v1Middleware
退出globalMiddleware
访问
/v2/tags
打印如下
Go
进入globalMiddleware
tagsHanlder
退出globalMiddleware