Gin框架系列之中间件基础
一、什么是中间件
开发者自定义的一些钩子函数,用于请求到达不同的地方进行拦截,做一些处理,比如:
- 登陆之前进行拦截,判断请求是否携带token
- 登陆之后进行权限校验
- 限流
...
二、中间件的简单使用
如下:
package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { router := gin.Default() router.GET("/login", Login) router.Run(":8080") } func Login(context *gin.Context) { context.String(http.StatusOK, "登陆!") }
当我们访问:http://127.0.0.1:8080/login,会响应我们对应的信息,但是后台会打印很多的日志,这是为什么呢?因为已经内置了日志相关的中间件。在:
... router := gin.Default() ...
的源码中:
// Default returns an Engine instance with the Logger and Recovery middleware already attached. func Default() *Engine { debugPrintWARNINGDefault() engine := New() engine.Use(Logger(), Recovery()) return engine }
通过Use方法来加载Logger中间件。
如果不想添加任何中间件,可以通过这种方式创建路由:
... router := gin.New() ...
三、中间件注意事项
中间件处于不同的位置,执行的位置也是不同,比如上面内置的2个中间件就是会在路由匹配之前运行。而下面这个:
... router := gin.New() router.GET("/login", Login) router.Use(MiddleWare()) router.GET("/home", Home) ...
显然在login后执行中间件,对进入home主页的路由进行校验。
如果有多个中间件应该如何执行呢?
package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" ) func MiddlewareA() gin.HandlerFunc { return func(context *gin.Context) { fmt.Println("MiddlewareA before request") // before request context.Next() // after request fmt.Println("MiddlewareA after request") } } func MiddlewareB() gin.HandlerFunc { return func(context *gin.Context) { fmt.Println("MiddlewareB before request") // before request context.Next() // after request fmt.Println("MiddlewareB after request") } } func main() { router := gin.Default() router.GET("/login", Login) router.Use(MiddlewareA(), MiddlewareB()) router.Run(":8080") } func Login(context *gin.Context) { context.String(http.StatusOK, "登陆!") }
上面有2个中间件A和B,当我们访问路由"/login"后,会出现如下的打印:
MiddlewareA before request
MiddlewareB before request
MiddlewareB after request
MiddlewareA after request
从这里可以看到中间件的执行特点。
作者:iveBoy
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。