Heim >Backend-Entwicklung >Golang >Wie kann ich Go-HTTP-Anfragen an einen anderen Server weiterleiten und dabei vermeiden, dass „http: Request.RequestURI kann in Clientanfragen nicht festgelegt werden'?
Gehen Sie zu HTTP: Eingehende Anfragen an einen anderen Server weiterleiten
Angenommen, Sie haben veraltete und versionierte Dienste („legacy“ und „version_2_of_doom“) ausgeführt nebeneinander. Sie möchten, dass alle POST-Anfragen von beiden Diensten gleichzeitig verarbeitet werden, um einen reibungslosen Übergang zu gewährleisten.
Zunächst haben Sie versucht, den Handler des alten Dienstes zu ändern, um die Anfrage direkt auf „version_2_of_doom“ zu duplizieren. Dieser Ansatz scheiterte jedoch mit dem Fehler „http: Request.RequestURI kann in Clientanfragen nicht festgelegt werden.“
Die bevorzugte Lösung besteht darin, eine neue Anfrage zu erstellen und nur die notwendigen Teile aus der eingehenden Anfrage zu kopieren. Dieser Prozess ähnelt dem, was ein Reverse-Proxy tut, den Sie im Paket „net/http/httputil“ untersuchen können.
Hier ist eine Beispielimplementierung:
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 }
Mit diesem Ansatz können Sie selektiv vorgehen Kopieren Sie die Header und erstellen Sie einen neuen Anforderungs-URI, der an den anderen Server gesendet werden soll. Wenn Sie diesem Muster folgen, können Sie eingehende HTTP-Anfragen nahtlos an mehrere Dienste weiterleiten, ohne die Anfragedetails zu ändern.
Das obige ist der detaillierte Inhalt vonWie kann ich Go-HTTP-Anfragen an einen anderen Server weiterleiten und dabei vermeiden, dass „http: Request.RequestURI kann in Clientanfragen nicht festgelegt werden'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!