首頁 > 後端開發 > Golang > 如何在不修改 http.ResponseWriter 的情況下記錄 HTTP 回應?

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

Barbara Streisand
發布: 2024-10-27 23:19:29
原創
604 人瀏覽過

How to Log HTTP Responses Without Modifying http.ResponseWriter?

在http.HandleFunc 中記錄HTTP 回應

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

中間件連結

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

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

<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 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)
    }
}</code>
登入後複製

應用解決方案

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

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

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

<code class="go">h := NewDefaultHandler(...)</code>
登入後複製

結論

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

以上是如何在不修改 http.ResponseWriter 的情況下記錄 HTTP 回應?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板