在上一篇标题为“在 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中文网其他相关文章!