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

Comment transférer des requêtes HTTP vers un autre serveur dans Go ?

DDD
Libérer: 2024-12-01 22:45:13
original
252 Les gens l'ont consulté

How to Forward HTTP Requests to Another Server in Go?

Go http : Transférer les requêtes HTTP reçues vers un autre serveur

Dans les scénarios où les versions de service coexistent, il peut être nécessaire de dupliquer les requêtes HTTP entrantes pour maintenir la compatibilité. Cet article explore une méthode pour rediriger les requêtes reçues par un service vers un autre à l'aide du langage de programmation Go.

Défi :

Un utilisateur a rencontré un problème en tentant de dupliquer le POST. requêtes dans un service Go vers un service distinct. La définition de req.URL.Host et req.Host a directement entraîné l'erreur "http : Request.RequestURI ne peut pas être défini dans les demandes des clients."

Solution :

L'approche recommandée consiste à créer un nouvel objet http.Request et à copier sélectivement les parties souhaitées de la demande d'origine. Cela garantit que le RequestURI est correctement défini pour la deuxième requête. De plus, si le corps de la requête doit être réutilisé, il doit être mis en mémoire tampon et attribué au corps de la nouvelle requête.

Exemple de code Go :

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
}
Copier après la connexion

Cette approche transfère efficacement la requête HTTP entrante vers l'autre serveur tout en respectant le RequestURI et d'autres paramètres HTTP critiques.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal