」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在不修改 http.ResponseWriter 的情況下記錄 HTTP 回應?

如何在不修改 http.ResponseWriter 的情況下記錄 HTTP 回應?

發佈於2024-11-09
瀏覽:854

How to Log HTTP Responses Without Modifying http.ResponseWriter?

在http.HandleFunc 中記錄HTTP 回應

本文討論了一種獲取HTTP 回應以進行日誌記錄的替代方法,而無需訴諸偽造請求或修改http.ResponseWriter。我們引入了中間件連結的概念,提供了函數式實作。

中介軟體連結

中介軟體連結涉及將控制權傳遞給處理程序鏈,這些處理程序在主請求執行之前和之後執行特定任務。這些處理程序(稱為中間件)接收請求和鏈中的下一個處理程序,確保有序執行。

我們定義一個充當 HTTP 處理程序組合器的自訂中間件函數:

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)
    }
}

應用解決方案

為了確保特定類別中所有處理程序的自動回應日誌記錄,我們建立另一個封裝日誌記錄中介軟體的處理程序組合器:

func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc {
    return NewResponseLoggingHandler(NewOtherStuffHandler(next))
}

現在,使用 NewDefaultHandler 實例化的任何處理程序鏈都會自動包含回應日誌記錄和其他預設行為。

h := NewDefaultHandler(...)

結論

使用中間件鏈接,我們可以透明地攔截和記錄HTTP 響應,而不需要偽造請求或修改http.ResponseWriter。這種方法允許模組化日誌記錄並簡化處理程序管理。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3