在給定的Go 程式碼中,設定了一個反向代理以將請求重新導向到www.google. com。當反向代理正常運作時,問題出現了:如何存取代理請求的回應正文?
解決這個問題的方法在於 httputil 套件,它提供了 ReverseProxy 類型。在最新版本的軟體包中,ReverseProxy 提供了一個可選的 ModifyResponse 函數,可以自訂和檢查來自後端的回應。
具體來說,透過實作此函數,開發人員可以在傳遞之前修改 *http.Response它給客戶。 ModifyResponse 的一個潛在用例是讀取和操作回應正文。
為了示範這一點,請考慮以下修改後的程式碼:
package main import ( "bytes" "fmt" "io/ioutil" "net/http" "net/http/httputil" "net/url" ) func main() { target := &url.URL{Scheme: "http", Host: "www.google.com"} proxy := httputil.NewSingleHostReverseProxy(target) proxy.ModifyResponse = func(resp *http.Response) (err error) { b, err := ioutil.ReadAll(resp.Body) // Read the HTML response body if err != nil { return err } resp.Body.Close() // The body is closed by the ReadAll function, but it's good practice to close it again b = bytes.Replace(b, []byte("server"), []byte("schmerver"), -1) // Modify the HTML response by replacing "server" with "schmerver" newBody := ioutil.NopCloser(bytes.NewReader(b)) resp.Body = newBody resp.ContentLength = int64(len(b)) resp.Header.Set("Content-Length", strconv.Itoa(len(b))) fmt.Println(resp) // Print the modified response for debugging purposes return nil } http.Handle("/google", proxy) http.ListenAndServe(":8099", nil) }
在此程式碼中,ModifyResponse 函數定義為讀取HTML 回應正文,透過取代特定字串對其進行修改,然後將修改後的正文設定為回應正文。透過處理「/google」URL 路徑,對 www.google.com 的請求將被代理,修改後的回應將被傳送回客戶端。
以上是如何在 Go 中檢查和修改反向代理的回應正文?的詳細內容。更多資訊請關注PHP中文網其他相關文章!