本文讨论了一种获取 HTTP 响应以进行日志记录的替代方法,而无需诉诸伪造请求或修改 http.ResponseWriter。我们引入了中间件链接的概念,提供了函数式实现。
中间件链接涉及将控制权传递给处理程序链,这些处理程序在主请求执行之前和之后执行特定任务。这些处理程序(称为中间件)接收请求和链中的下一个处理程序,确保有序执行。
我们定义一个自定义中间件函数,充当 HTTP 处理程序组合器:
<code class="go">func NewResponseLoggingHandler(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // Replace the response writer with a recorder for subsequent handlers c := httptest.NewRecorder() next(c, r) // Copy data from the recorder to the original response writer for k, v := range c.HeaderMap { w.Header()[k] = v } w.WriteHeader(c.Code) c.Body.WriteTo(w) } }</code>
为了确保特定类别中所有处理程序的自动响应日志记录,我们创建另一个封装日志记录中间件的处理程序组合器:
<code class="go">func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc { return NewResponseLoggingHandler(NewOtherStuffHandler(next)) }</code>
现在,任何处理程序链都使用实例化NewDefaultHandler 将自动包含响应日志记录和其他默认行为。
<code class="go">h := NewDefaultHandler(...)</code>
使用中间件链,我们可以透明地拦截和记录 HTTP 响应,而不需要伪造请求或修改 http.响应作家。这种方法允许模块化日志记录并简化处理程序管理。
以上是如何在不修改 http.ResponseWriter 的情况下记录 HTTP 响应?的详细内容。更多信息请关注PHP中文网其他相关文章!