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 }
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!