Maison >développement back-end >Golang >Comment puis-je transférer les requêtes HTTP entrantes vers un autre serveur dans Go ?

Comment puis-je transférer les requêtes HTTP entrantes vers un autre serveur dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-05 07:46:11594parcourir

How Can I Forward Incoming HTTP Requests to Another Server in Go?

Transmettre les requêtes HTTP entrantes vers un autre serveur dans Go

Dans le cadre de migration de services, il est souvent nécessaire de transmettre les requêtes vers des versions différentes d'une demande. Ceci peut être réalisé en copiant la requête HTTP entrante et en l'envoyant à la cible souhaitée.

Cependant, les tentatives de transfert direct de la requête originale à l'aide de req.URL.Host et req.Host entraîneront l'erreur "http : Request.RequestURI ne peut pas être défini dans les requêtes des clients." Pour surmonter ce problème, une approche plus globale est nécessaire.

Une méthode efficace consiste à utiliser les principes du proxy inverse, comme illustré dans net/http/httputil. En créant une nouvelle demande et en copiant sélectivement les parties requises, nous pouvons transférer la demande efficacement.

Voici un exemple de mise en œuvre :

func handler(w http.ResponseWriter, req *http.Request) {
    // Buffer the request body to preserve its contents
    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 the target URL from the original request
    url := fmt.Sprintf("%s://%s%s", proxyScheme, proxyHost, req.RequestURI)

    // Create the new request with the modified URL and buffered body
    proxyReq, err := http.NewRequest(req.Method, url, bytes.NewReader(body))

    // Selectively copy relevant headers
    proxyReq.Header = make(http.Header)
    for h, val := range req.Header {
        proxyReq.Header[h] = val
    }

    // Execute the request through the HTTP client
    resp, err := httpClient.Do(proxyReq)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadGateway)
        return
    }
    defer resp.Body.Close()

    // Forward the response back to the original request
}

En utilisant cette approche, vous pouvez transférer efficacement le HTTP entrant requêtes vers plusieurs destinations, permettant des transitions fluides lors des migrations de services ou d'autres scénarios nécessitant une redirection des requêtes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn