请求
RequestContext 中与请求相关的功能。
请求上下文 RequestContext
是用于保存 HTTP 请求和设置 HTTP 响应的上下文,它提供了许多方便的 API 接口帮助用户开发。
Hertz 在 HandlerFunc
设计上,同时提供了一个标准 context.Context
和一个 RequestContext
作为函数的入参。
handler/middleware
函数签名为:
type HandlerFunc func(ctx context.Context, c *RequestContext)
context.Context
与 RequestContext
都有存储键值的能力。
context.Context
作为上下文在中间件和各函数之间传递,通用的标准化参数、协程安全。建议都使用context.Context
进行上下文数据传递。
*RequestContext
提供了一种比context.Context
更轻量的方式,可以使用Get
, Set
方法进行存储中间数据。但要注意 *RequestContext
会在请求结束时被回收复用,需要确保*RequestContext
的使用不能超过handler的生命周期,不允许有异步后台协程,详见下一节。
因为 *RequestContext
请求结束会被回收复用,请不要将其传递到后台异步协程做任何操作。
如有需要,可以主动调用 Exile()
方法标识为不会回收,或使用 Copy()
生成一个副本以供后台使用。
为了快速排查问题,可以通过设置环境变量 HERTZ_DISABLE_REQUEST_CONTEXT_POOL=1
来关闭此行为,但是建议还是通过按需 Exile()
或 Copy()
方法。
*RequestContext
大部分方法并非协程安全。在 v0.9.7
版本之前,任何 Header 相关的方法都不是协程安全,这包括绝大部的读和写方法,如常见的 Peek
读方法。在 v0.9.7
版本及以后,优化了Header的读方法,可以保证协程并发读安全。但是如果存在异步后台协程,仍需要参考前面小节的说明。