Gestion de plusieurs appels WriteHeader dans le serveur HTTP de Go
Dans le package net/http de Go, il est essentiel d'éviter plusieurs appels à WriteHeader pour un même demande. Effectuer un appel goroutine dans la fonction de gestionnaire principal peut entraîner ce problème, comme le montre l'exemple suivant :
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }) ... }
Dans la fonction de gestionnaire anonyme, nous imprimons l'URL et démarrons une goroutine qui appelle HandleIndex. . Cependant, cela provoque l'erreur « appels à réponses multiples.WriteHeader » dans la console.
Pourquoi cela se produit-il ? Par défaut, Go définit l'état de la réponse sur 200 (HTTP OK) s'il n'est pas explicitement défini dans la fonction de gestionnaire. Dans cet exemple, même si HandleIndex définit l'en-tête dans une goroutine distincte, la fonction du gestionnaire principal se termine sans rien écrire dans la réponse ni définir le statut. Cela déclenche Go pour définir automatiquement le statut, ce qui entraîne plusieurs écritures d'en-tête.
Pour résoudre ce problème, nous pouvons supprimer le préfixe go de go HandleIndex afin qu'il soit exécuté dans la même goroutine que la fonction de gestionnaire principal. Alternativement, dans HandleIndex, nous pourrions définir l'en-tête de réponse avant le retour de la fonction de gestionnaire principal.
Une autre option consiste à utiliser un middleware pour définir l'en-tête de réponse avant que la requête n'atteigne la fonction de gestionnaire principal. De cette façon, la fonction du gestionnaire principal n'a pas besoin de définir l'en-tête et le middleware garantit que l'en-tête n'est défini qu'une seule fois :
func main() { http.HandleFunc("/", middleware(HandleIndex)) ... } func middleware(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain") next(w, r) } }
En utilisant un middleware, nous pouvons garantir que l'en-tête de réponse est défini avant de traiter la demande, évitant ainsi tout problème potentiel avec plusieurs appels WriteHeader.
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!