使用 Go 记录 HTTP 响应
使用 Gorilla 的 mux 和 handler 等包在 Go 中记录请求非常简单。然而,记录响应可能会比较棘手。本文探讨如何实现此目的。
使用自定义日志记录处理程序
一种解决方案是创建一个包装 HTTP 处理程序函数的自定义日志记录处理程序。下面 Eric Broda 的代码提供了一个初始框架:
func logHandler(fn http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { x, err := httputil.DumpRequest(r, true) if err != nil { http.Error(w, fmt.Sprint(err), http.StatusInternalServerError) return } log.Println(fmt.Sprintf("%q", x)) } }
修改响应
要实际将响应发送到客户端,需要修改代码:
func logHandler(fn http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { x, err := httputil.DumpRequest(r, true) if err != nil { http.Error(w, fmt.Sprint(err), http.StatusInternalServerError) return } log.Println(fmt.Sprintf("%q", x)) rec := httptest.NewRecorder() fn(rec, r) log.Println(fmt.Sprintf("%q", rec.Body)) // this copies the recorded response to the response writer for k, v := range rec.HeaderMap { w.Header()[k] = v } w.WriteHeader(rec.Code) rec.Body.WriteTo(w) } }
此修改后的代码包装了处理程序函数并记录请求和响应正文。通过将此日志处理程序放置在中间件堆栈中,您可以轻松地在整个应用程序中记录响应。
以上是如何在 Go 中有效记录 HTTP 响应?的详细内容。更多信息请关注PHP中文网其他相关文章!