首頁  >  文章  >  後端開發  >  如何存取 Go 反向代理中的回應正文?

如何存取 Go 反向代理中的回應正文?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-08 08:20:02951瀏覽

How to Access the Response Body in a Go Reverse Proxy?

在反向代理中訪問響應體

使用反向代理時,您可能會遇到需要訪問從後端收到的響應體的情況伺服器。本文深入探討如何使用 httputil 套件在 Go 中檢索回應正文。

在提供的程式碼片段中,您有一個簡單的反向代理,可以將請求轉發到 Google:

target := &url.URL{Scheme: "http", Host: "www.google.com"}
proxy := httputil.NewSingleHostReverseProxy(target)

http.Handle("/google", proxy)
http.ListenAndServe(":8099", nil)

存取響應體的關鍵在於ReverseProxy類型的ModifyResponse欄位。根據官方文檔,ModifyResponse 是一個可選函數,可讓您修改後端的回應。

以下是一個在將回應正文傳送到客戶端之前讀取和修改回應正文的範例:

import (
    "bytes"
    "fmt"
    "io/ioutil"
)

func rewriteBody(resp *http.Response) (err error) {
    b, err := ioutil.ReadAll(resp.Body) //Read html
    if err != nil {
        return err
    }
    err = resp.Body.Close()
    if err != nil {
        return err
    }
    b = bytes.Replace(b, []byte("server"), []byte("schmerver"), -1) // replace html
    body := ioutil.NopCloser(bytes.NewReader(b))
    resp.Body = body
    resp.ContentLength = int64(len(b))
    resp.Header.Set("Content-Length", strconv.Itoa(len(b)))
    return nil
}

func main() {
    target, _ := url.Parse("http://example.com")
    proxy := httputil.NewSingleHostReverseProxy(target)
    proxy.ModifyResponse = rewriteBody

    http.Handle("/google", proxy)
    http.ListenAndServe(":8099", nil)
}

在此程式碼中,rewriteBody 函數讀取回應正文,對其進行修改(在本例中,將單字「server」替換為「schmerver」),然後設定修改後的內容body 作為新的回應主體。

以上是如何存取 Go 反向代理中的回應正文?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn