Écriture d'en-têtes multiples dans un programme HTTP Simple Go
Un problème courant dans le package net/http de Go est la rencontre de l'erreur "réponse multiple. Appels WriteHeader." Cela se produit lorsque plusieurs en-têtes sont écrits dans la même réponse HTTP.
Considérez l'extrait de code suivant :
import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }) fmt.Println("Starting Server...") log.Fatal(http.ListenAndServe(":5678", nil)) } func HandleIndex(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) w.Write([]byte("Hello, World!")) }
Lorsqu'il est exécuté et accessible via localhost:5678 dans Chrome, la console affiche :
Starting Server... / 2015/01/15 13:41:29 http: multiple response.WriteHeader calls /favicon.ico 2015/01/15 13:41:29 http: multiple response.WriteHeader calls
Cause de l'écriture d'en-têtes multiples
Le La clé de cette erreur réside dans la fonction anonyme utilisée comme gestionnaire de requêtes :
func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }
Cette fonction imprime l'URL, génère une nouvelle goroutine qui appelle HandleIndex() et poursuit l'exécution. Si une fonction de gestionnaire ne définit pas d'état de réponse avant le premier appel d'écriture, Go le définit automatiquement sur 200 (HTTP OK). Cependant, si le gestionnaire termine sans écrire dans la réponse, Go définira toujours le statut sur 200.
Dans ce cas, la fonction anonyme ne définit aucun statut et n'écrit rien, donc Go définit le statut sur 200.
Goroutine et écriture d'en-têtes multiples
Lorsque HandleIndex() est invoqué dans une goroutine distincte, la fonction anonyme d'origine complète et définit l'en-tête de réponse. Pendant ce temps, la nouvelle goroutine définit également l'en-tête, ce qui entraîne l'erreur.
Solution
Pour résoudre cette erreur, supprimez le mot-clé go pour appeler HandleIndex() dans la goroutine d'origine ou définir explicitement le statut de la réponse dans la fonction anonyme.
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!