目标
- 关于gin.Default(),gin.New(),gin.Use()
- group与子group之间的关系,多group与middleware之间关系
- 中间件的类型,全局,group,get,不同类型的中间件什么时候执行。中间件 next 和abort行为
- 如何实现http请示请求?http并发如何处理,middleware的context是什么
基本用法
func initMiddleware(ctx *gin.Context) {
fmt.Println("全局中间件 通过 r.Use 配置")
// 调用该请求的剩余处理程序
ctx.Next()
// 终止调用该请求的剩余处理程序
//ctx.Abort()
}
//0. 初始化
r := gin.Default()
//1. 全局中间件
r.Use(initMiddleware)
//2. group与子group,类型为RouterGroup
adminRouter := router.Group("/admin", initMiddleware)
userRouter := adminRouters.Group("/user", initMiddleware)
//3. 请求
userRouters.GET("/user", initMiddleware, controller.UserController{}.Index)
//4. 中间件共享数据
ctx.Set("username", "张三")
username, _ := ctx.Get("username")
关于初始化
使用流程中涉及到几个重要的结构体
gin.Engine,gin.Context,gin.RouterGroup
gin.Default(),gin.New(),gin.Use()
func Default() *Engine {
// 初始化一个新的Egine
engine := New()
// 默认注册全局中间件Logger()和Recovery()
//Logger()定义一个中间件,实现每次请求进来的日志打印
//可以配置日志的过滤路径,打印颜色,打印的位置等
//Recovery()定义一个中间件,用来拦截运行中产生的所有panic,输出打印并返回500
//同样可以配置全局panic拦截的行为
//如果要配置Logger与Recovery则直接在应用中使用gin.New()。然后再在应用中调用
//engine.Use(LoggerWithFormatter(xxxx), RecoveryWithWriter(xxxx))。
engine.Use(Logger(), Recovery())
return engine
}
//初始化Engine
func New() *Engine {
engine := &Engine{
//初始化化第一个RouterGroup, root表示是否为根RouterGroup
RouterGroup: RouterGroup{
Handlers: nil,
basePath: "/",
root: true,
},
FuncMap: template.FuncMap{},
TrustedPlatform: defaultPlatform,
MaxMultipartMemory: defaultMultipartMemory,
//请求方法数组,GET,POST,DELETE,每个方法下面有个链表
trees: make(methodTrees, 0, 9),
delims: render.Delims{Left: "{
{", Right: "}}"},
//已删除部分配置项
}
//给第一个Group配置engine,也就是本engine
engine.RouterGroup.engine = engine
engine.pool.New = func() any {
return engine.allocateContext(engine.maxParams)
}
return engine
}
//注册全局中间件
func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes {
//把middleware函数append到上面创建的engine的根RouterGroup的Handlers数组中
engine.RouterGroup.Use(middleware...)
//初始化404和405处理的中间间
engine.rebuild404Handlers()
engine.rebuild405Handlers()
return engine
}
Engine继承了RouterGroup,gin.Default()初始化了Engine与第一个RouterGroup,并初始化了两个默认的中间件,Logger(), Recovery(),他们的作用与配置上面代码中有介绍
gin.Use的核心功能为把传入进来的中间件合并到RouterGroup的Handlers数组中,代码如下
group.Handlers = append(group.Handlers, middleware...)
重要的结构体
type HandlerFunc func(*Context)
type HandlersChain []HandlerFunc
type RouterGroup struct {
Handlers HandlersChain