一.gin的中间件
1.中间件的概念
gin框架允许在处理请求时,加入用户自己的钩子函数,该钩子函数即中间件。他的作用与Java中的拦截器,Node中的中间件相似。中间件需要返回gin.HandlerFunc函数,多个中间件通过Next函数来依次执行。
2.基本使用
现在设计一个中间件,在每次路由函数执行前打印一句话,在基础项目上新建middleware文件夹,新建一个中间件文件MyFmt.go:
package middleware
import (
"fmt"
"github.com/gin-gonic/gin"
)
// 定义一个中间件
func MyFMT() gin.HandlerFunc {
return func(c *gin.Context) {
host := c.Request.Host
fmt.Printf("Before: %s\n",host)
c.Next()
fmt.Println("Next: ...")
}
}
在路由函数中使用定义的中间件:
r.GET("/user/login", middleware.MyFMT(), userLogin)
打印结果
Before: localhost:8080
Next: ...
[GIN] 2019/07/28 - 16:28:16 | 200 | 266.33µs | ::1 | GET /user/login
这里只是基础的运用,更高级的运用建议查看官方文档。
二.请求的拦截与后置
中间件的最大作用就是拦截过滤请求,比如我们有些请求需要用户登录或者需要特定权限才能访问,这时候便可以中间件中做过滤拦截。如果在中间件中调用gin.Context的Next()方法,则可以请求到达并完成业务处理后,再经过中间件后置拦截处理:
func MyMiddleware(c *gin.Context){
//请求前
c.Next()
//请求后
}
1.gin.Engine
Engine是框架的入口,是gin框架的核心,通过Engine对象来定义服务路由信息、组装插件、运行服务。不过Engine的本质只是对内置HTTP服务的包装。
gin.Default() 函数会生成一个默认的 Engine 对象,包含2个默认常用插件。
func Default() *Engine {
engine := New()
engine.Use(Logger(), Recovery())
return engine
}
2.gin.Context
gin.Context内保存了请求的上下文信息,是所有请求处理器的入口参数:
type HandlerFunc func(*Context)
type Context struct {
...
Request *http.Request // 请求对象
Writer ResponseWriter // 响应对象
Params Params // URL匹配参数
...
Keys map[string]interface{} // 自定义上下文信息
...
}
Context 对象提供了非常丰富的方法用于获取当前请求的上下文信息,如果你需要获取请求中的 URL 参数、Cookie、Header 都可以通过 Context 对象来获取。这一系列方法本质上是对 http.Request 对象的包装。
三.总结
这里只是就gin讲述了一些基础的知识,其他会在下文中讲到。