本文档解释了如何在 Gin Web 框架中开发自定义中间件。中间件组件在 Gin 应用程序中至关重要,它们允许您在请求处理之前、期间或之后处理请求、修改响应并执行操作。有关 Gin 自带的内置中间件组件的信息,请参阅内置中间件。
Gin 中的中间件是一个可以访问请求-响应生命周期的函数。它可以执行代码、修改请求和响应对象、结束请求-响应生命周期,或调用链中的下一个中间件。
在 Gin 中,中间件函数接受一个 *Context 参数,并且没有返回值
来源:context.go55-93 middleware_test.go17-43
Gin 中的中间件执行遵循“俄罗斯套娃”模型,每个中间件都包裹着下一个。请求按照中间件添加的顺序流经每个中间件,而响应则以相反的顺序流回。
c.Next() 之前执行的代码(在请求到达下一个中间件/处理器之前)c.Next() 返回后执行的代码(在响应被下一个中间件/处理器处理后)来源:context.go184-195 middleware_test.go17-43
为所有路由全局注册中间件
或为特定组注册
c.Next() 函数会执行链中待处理的处理器。它会增加 Context 的 index 属性,并调用链中的下一个处理器。
要阻止后续中间件和处理器运行,请使用 c.Abort() 方法
来源:context.go184-232 middleware_test.go159-183
Context 对象充当键值存储,允许您在中间件和处理器之间共享数据
示例
设置值
获取值
来源:context.go262-459 context_test.go241-257
来源:logger.go189-281 logger_test.go22-84
创建接受配置参数的中间件很常见
有时您可能希望仅在某些条件下应用中间件
来源:logger.go211-281 logger_test.go417-436
Gin 提供了多种处理中间件错误的方法
来源:context.go226-259 middleware_test.go206-227
保持中间件专注:每个中间件应具有单一职责。
顺序很重要:中间件按照添加的顺序执行。将错误恢复等关键中间件放在链的早期。
提前返回:如果一个中间件中止了链,请立即返回以避免运行不必要的代码。
检查错误:始终在中间件中处理潜在错误。
在 Goroutine 中使用 c.Copy():如果需要在 Goroutine 中使用 Context,请使用 c.Copy() 创建一个副本。
小心响应写入:一旦头部被写入,就不能再修改。
使用 Context 共享数据:优先使用 c.Set() 和 c.Get(),而不是全局变量。
考虑中间件配置:使中间件可配置以提高灵活性。
这是一个结合了各种中间件技术的综合示例
自定义中间件是 Gin 中一个强大的功能,它允许您在应用程序中模块化横切关注点。通过理解中间件的执行流程并利用 Context 进行数据共享,您可以创建可重用的组件,从而增强应用程序的功能,同时保持路由处理器简洁和专注。
请记住,中间件的执行遵循它们添加到路由器的顺序,理解预处理和后处理阶段对于正确的中间件实现至关重要。