首页 >后端开发 >Golang >如何使用中间件链接和功能处理程序组合器在 Go 的'http.HandleFunc”中记录 HTTP 响应?

如何使用中间件链接和功能处理程序组合器在 Go 的'http.HandleFunc”中记录 HTTP 响应?

Patricia Arquette
Patricia Arquette原创
2024-10-28 04:41:30886浏览

How can you log HTTP responses in Go's `http.HandleFunc` using middleware chaining and functional handler combinators?

在 http.HandleFunc

中记录传入 HTTP 请求的响应

在上一篇标题为“在 go 中,如何检查 HTTP写入 http.ResponseWriter 的响应?”我们探索了一种在单元测试环境中检查服务器响应的方法。但是,这种方法可能不适合实时服务器。

中间件链接

另一种解决方案是中间件链接,这是一种修改和记录 HTTP 的常用技术响应和请求,同时保留原始的请求-响应流程。

函数处理程序组合器

我们可以创建自己的函数处理程序,而不是使用 negroni 这样的库组合器:

<code class="go">func NewFooHandler(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // do something before
        next(w, r)
        // do something after
    }
}</code>

创建处理程序链

我们可以使用组合器将多个处理程序链接在一起:

<code class="go">h := NewFooHandler(NewBarHandler(NewBazHandler(Sink)))

In在本例中,Sink 是一个不执行任何操作的空处理程序。

实现响应日志记录

使用处理程序组合器方法,我们可以创建一个记录响应的处理程序:

<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
        c := httptest.NewRecorder()
        next(c, r)

        // Copy the response from the recorder to the actual writer
        for k, v := range c.HeaderMap {
            w.Header()[k] = v
        }
        w.WriteHeader(c.Code)
        c.Body.WriteTo(w)
    }
}

应用响应日志记录处理程序

我们可以通过创建默认处理程序组合器将响应日志记录处理程序应用于所有 HTTP 路由:

<code class="go">func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc {
    return NewResponseLoggingHandler(NewOtherStuffHandler(next))
}</code>

这样,每当我们启动像这样的链时:

<code class="go">h := NewDefaultHandler(...)</code>

它将自动包含响应日志记录和任何其他默认处理程序。

以上是如何使用中间件链接和功能处理程序组合器在 Go 的'http.HandleFunc”中记录 HTTP 响应?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn