本文討論了一種獲取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中文網其他相關文章!