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中文網其他相關文章!