Maison >développement back-end >Golang >Comment puis-je transférer les requêtes HTTP Go vers un autre serveur tout en évitant « http : Request.RequestURI ne peut pas être défini dans les requêtes client » ?

Comment puis-je transférer les requêtes HTTP Go vers un autre serveur tout en évitant « http : Request.RequestURI ne peut pas être défini dans les requêtes client » ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-13 21:16:29900parcourir

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

Go HTTP : transfert des requêtes entrantes vers un autre serveur

Supposons que vous ayez des services hérités et versionnés ("legacy" et "version_2_of_doom") en cours d'exécution côte à côte. Vous souhaitez que toutes les requêtes POST soient traitées simultanément par les deux services pour une transition en douceur.

Au départ, vous avez tenté de modifier le gestionnaire de l'ancien service pour dupliquer directement la requête vers "version_2_of_doom". Cependant, cette approche a échoué avec l'erreur « http : Request.RequestURI ne peut pas être défini dans les demandes des clients. »

La solution préférée consiste à créer une nouvelle demande et à copier uniquement les parties nécessaires de la demande entrante. Ce processus ressemble à ce que fait un proxy inverse, que vous pouvez examiner dans le package "net/http/httputil".

Voici un exemple d'implémentation :

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
}

Cette approche vous permet de sélectionner de manière sélective copiez les en-têtes et créez un nouvel URI de demande à envoyer à l'autre serveur. En suivant ce modèle, vous pouvez transférer de manière transparente les requêtes HTTP entrantes vers plusieurs services sans modifier les détails de la requête.

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