在提供的 Go 程式碼中,設定了反向代理以將請求重定向到 Google。然而,為了獲得更深入的見解或自訂回應,存取回應正文是必不可少的。
解決方案在於利用 ReverseProxy 結構中的 ModifyResponse 欄位。此欄位允許指定在 HTTP 回應到達客戶端之前對其進行修改的函數。
以下修改後的程式碼示範如何讀取和修改回應正文:
package main import ( "bytes" "fmt" "io" "io/ioutil" "net/http" "net/http/httputil" "net/url" "strconv" ) func main() { target := &url.URL{Scheme: "http", Host: "www.google.com"} proxy := httputil.NewSingleHostReverseProxy(target) // Modify the response body before sending it to the client proxy.ModifyResponse = func(resp *http.Response) (err error) { b, err := ioutil.ReadAll(resp.Body) // Read the response body if err != nil { return err } err = resp.Body.Close() // Close the `Body` and `resp` if err != nil { return err } // Modify the response body b = bytes.Replace(b, []byte("server"), []byte("schmerver"), -1) // Create a new `body` to keep the `Content-Length` and `Body` up-to-date body := ioutil.NopCloser(bytes.NewReader(b)) resp.Body = body resp.ContentLength = int64(len(b)) resp.Header.Set("Content-Length", strconv.Itoa(len(b))) fmt.Println("Modified response: ", string(b)) // See the modified response return nil } http.Handle("/google", proxy) http.ListenAndServe(":8099", nil) }
ModifyResponse 函數使用ioutil. ReadAll 將原始回應正文讀取到緩衝區。然後它關閉原來的resp.Body並修改body內容。
為了確保回應有效,建立了一個新的body並將其指派給resp.Body。 Content-Length 標頭也會更新以反映新的正文長度。
最後,將修改後的回應正文列印到控制台以方便檢查,並將修改後的回應傳送到客戶端。
以上是如何檢查和修改 Go 反向代理中的回應正文?的詳細內容。更多資訊請關注PHP中文網其他相關文章!