首页 > 后端开发 > Golang > 正文

如何使用'http.HandleFunc”和中间件记录实时 HTTP 响应?

DDD
发布: 2024-10-27 10:29:03
原创
316 人浏览过

How to Log Real-Time HTTP Responses with `http.HandleFunc` and Middleware?

使用 http.HandleFunc 记录传入的 HTTP 请求

在之前的讨论中,我们探索了使用虚假请求检查 HTTP 响应,这是一种适合单元测试的技术。然而,我们还寻求一种在实时服务器上记录实时响应数据的方法。

中间件链

一种流行的方法涉及创建中间件链。像 Negroni 这样的库提供中间件功能,其中处理程序被组合并按顺序执行。使用处理程序组合器可以实现最小中间件实现:

<code class="go">func NewFooHandler(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // Do pre-handling tasks
        next(w, r)
        // Do post-handling tasks
    }
}</code>
登录后复制

然后可以将这些组合器链接起来形成处理程序:

<code class="go">h := NewFooHandler(NewBarHandler(NewBazHandler(Sink)))</code>
登录后复制

应用于 HTTP.HandleFunc

要将此技术应用于您的问题,您可以创建一个处理程序组合器:

<code class="go">func NewResponseLoggingHandler(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // Record the response
        c := httptest.NewRecorder()
        next(c, r)
        
        // Copy responses
        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>
登录后复制

通过使用此默认处理程序:

<code class="go">h := NewDefaultHandler(...)</code>
登录后复制

所有后续处理程序将自动包含响应日志记录。

以上是如何使用'http.HandleFunc”和中间件记录实时 HTTP 响应?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板