首頁 > 後端開發 > Golang > 如何將 Go HTTP 請求轉送到另一台伺服器,同時避免出現「http: Request.RequestURI can't be set in client requests」?

如何將 Go HTTP 請求轉送到另一台伺服器,同時避免出現「http: Request.RequestURI can't be set in client requests」?

Patricia Arquette
發布: 2024-12-13 21:16:29
原創
898 人瀏覽過

How Can I Forward Go HTTP Requests to Another Server While Avoiding

Go HTTP:將傳入請求轉送到另一台伺服器

假設您正在執行舊版和版本化服務(“legacy”和「version_2_of_doom」)彼此並肩。您希望兩個服務同時處理所有 POST 請求,以實現平穩過渡。

最初,您嘗試修改舊服務的處理程序以直接將請求複製到「version_2_of_doom」。但是,此方法失敗,並出現錯誤「http: Request.RequestURI 無法在客戶端請求中設定。」

首選解決方案是建立新請求並僅從傳入請求中複製必要的部分。此過程類似於反向代理的作用,您可以在“net/http/httputil”套件中檢查它。

這是一個範例實作:

func handler(w http.ResponseWriter, req *http.Request) {
    body, err := ioutil.ReadAll(req.Body)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    req.Body = ioutil.NopCloser(bytes.NewReader(body))

    url := fmt.Sprintf("%s://%s%s", proxyScheme, proxyHost, req.RequestURI)

    proxyReq, err := http.NewRequest(req.Method, url, bytes.NewReader(body))

    proxyReq.Header = make(http.Header)
    for h, val := range req.Header {
        proxyReq.Header[h] = val
    }

    resp, err := httpClient.Do(proxyReq)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadGateway)
        return
    }
    defer resp.Body.Close()

    // legacy code
}
登入後複製

這種方法可讓您選擇性地複製標頭並建立新的請求 URI 以傳送到其他伺服器。透過遵循此模式,您可以將傳入的 HTTP 請求無縫轉送至多個服務,而無需變更請求詳細資料。

以上是如何將 Go HTTP 請求轉送到另一台伺服器,同時避免出現「http: Request.RequestURI can't be set in client requests」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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