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

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

Patricia Arquette
發布: 2024-11-19 16:39:02
原創
609 人瀏覽過

How can I access the response body in Go's reverse proxy?

如何在Go 的反向代理中訪問Response Body

在Go 中,httputil/reverseproxy 套件提供了一種便捷的方式來實現反向代理伺服器。然而,存取底層 HTTP 請求的回應正文可能具有挑戰性。

原始程式碼

給定的 Go 程式碼示範了一個簡單的反向代理伺服器:

package main

import (
    "net/http"
    "net/http/httputil"
    "net/url"
)

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

    http.Handle("/google", proxy)
    http.ListenAndServe(":8099", nil)
}
登入後複製

存取回應正文

存取回應body,您可以利用httputil/reverseproxy套件提供的ModifyResponse函數。此函數可讓您在將 HTTP 回應傳送到客戶端之前對其進行修改。

透過實作 ModifyResponse函數,您可以對回應執行各種操作,包括:

  • 讀取並修改回應正文
  • 設定自訂標頭
  • 重定向回應
  • 重定向回應
>

範例

以下是如何修改回應正文的範例:
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
}

target, _ := url.Parse("http://example.com")
proxy := httputil.NewSingleHostReverseProxy(target)
proxy.ModifyResponse = rewriteBody
登入後複製

透過在這樣,您可以在傳送到客戶端之前修改和讀取回應正文。

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

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