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'?

Wie kann ich Go-HTTP-Anfragen an einen anderen Server weiterleiten und dabei vermeiden, dass „http: Request.RequestURI kann in Clientanfragen nicht festgelegt werden'?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-13 21:16:29900Durchsuche

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

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn