Heim >Backend-Entwicklung >Golang >Wie leite ich HTTP-Anfragen in Go an einen anderen Server weiter?
Gehe zu http: Empfangene HTTP-Anfragen an einen anderen Server übertragen
In Szenarien, in denen Dienstversionen nebeneinander existieren, kann es erforderlich sein, eingehende HTTP-Anfragen zu duplizieren um die Kompatibilität aufrechtzuerhalten. In diesem Artikel wird eine Methode zum Umleiten von von einem Dienst empfangenen Anforderungen an einen anderen mithilfe der Programmiersprache Go untersucht.
Herausforderung:
Beim Versuch, POST zu duplizieren, ist ein Benutzer auf ein Problem gestoßen Anfragen in einem Go-Dienst an einen separaten Dienst weiterleiten. Das Setzen von req.URL.Host und req.Host führte direkt zum Fehler „http: Request.RequestURI kann in Client-Anfragen nicht festgelegt werden.“
Lösung:
Der empfohlene Ansatz besteht darin, ein neues http.Request-Objekt zu erstellen und die gewünschten Teile selektiv aus der ursprünglichen Anfrage zu kopieren. Dadurch wird sichergestellt, dass der RequestURI für die zweite Anfrage richtig festgelegt ist. Wenn der Anfragetext außerdem wiederverwendet werden muss, sollte er gepuffert und dem Text der neuen Anfrage zugewiesen werden.
Go-Code-Beispiel:
func handler(w http.ResponseWriter, req *http.Request) { // Buffer the body for reuse body, err := ioutil.ReadAll(req.Body) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } req.Body = ioutil.NopCloser(bytes.NewReader(body)) // Construct a new request with the desired URL and body proxyScheme := "http" proxyHost := "example.com" url := fmt.Sprintf("%s://%s%s", proxyScheme, proxyHost, req.RequestURI) proxyReq, err := http.NewRequest(req.Method, url, bytes.NewReader(body)) // Copy essential headers proxyReq.Header = make(http.Header) for h, val := range req.Header { proxyReq.Header[h] = val } // Send the request to the other server resp, err := httpClient.Do(proxyReq) if err != nil { http.Error(w, err.Error(), http.StatusBadGateway) return } defer resp.Body.Close() // Handle the response as usual }
Dieser Ansatz überträgt die eingehende HTTP-Anfrage effektiv an den anderen Server und respektiert dabei den RequestURI und andere kritische HTTP-Parameter.
Das obige ist der detaillierte Inhalt vonWie leite ich HTTP-Anfragen in Go an einen anderen Server weiter?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!