Heim >Backend-Entwicklung >Golang >Wie leite ich HTTP-Anfragen in Go an einen anderen Server weiter?

Wie leite ich HTTP-Anfragen in Go an einen anderen Server weiter?

DDD
DDDOriginal
2024-12-01 22:45:13266Durchsuche

How to Forward HTTP Requests to Another Server in Go?

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!

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