Maison > développement back-end > Golang > Pourquoi est-ce que je reçois l'erreur « http : appels à réponses multiples.WriteHeader » sur mon serveur HTTP Go ?

Pourquoi est-ce que je reçois l'erreur « http : appels à réponses multiples.WriteHeader » sur mon serveur HTTP Go ?

DDD
Libérer: 2024-12-17 13:24:11
original
671 Les gens l'ont consulté

Why am I getting the

Appels WriteHeader multiples dans un serveur HTTP simple

Un serveur HTTP de base implémenté dans Go à l'aide du package net/http présente un comportement inhabituel, car indiqué par le message d'erreur :

http: multiple response.WriteHeader calls
Copier après la connexion

Cette erreur suggère que le serveur tente d'écrire l'en-tête de réponse plusieurs fois, ce qui n'est pas le cas. autorisé par la spécification HTTP. Analysons le code pour comprendre pourquoi ce problème se produit :

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

Analyse

Le problème principal réside dans la fonction anonyme enregistrée en tant que gestionnaire des requêtes entrantes :

func(w http.ResponseWriter, r *http.Request) {
    fmt.Println(r.URL)
    go HandleIndex(w, r)
}
Copier après la connexion

Cette fonction imprime l'URL de la requête et démarre une nouvelle goroutine pour appeler HandleIndex(). Ensuite, il continue de s'exécuter normalement.

Si la fonction de gestionnaire ne définit pas l'état de la réponse ou n'écrit rien dans la réponse, Go définira automatiquement l'état sur 200 (HTTP OK) et reviendra. Ce comportement s'applique à la fonction anonyme de notre code, qui ne définit pas explicitement le statut de la réponse ni n'y écrit avant la ligne go HandleIndex(w, r).

Lorsque HandleIndex() est invoqué dans un autre goroutine, la fonction anonyme continue son exécution, se terminant par le traitement des requêtes. Étant donné que l’état de la réponse n’a pas été défini au préalable, Go le définira automatiquement sur 200 HTTP OK. Cependant, la goroutine générée tentera également de définir l'état de la réponse dans HandleIndex(), ce qui entraînera l'erreur « appels multiples de réponse.WriteHeader ».

Solution

Pour Pour éviter ce problème, supprimez le mot-clé "go" de la ligne qui démarre la goroutine :

func(w http.ResponseWriter, r *http.Request) {
    fmt.Println(r.URL)
    HandleIndex(w, r)
}
Copier après la connexion

ou assurez-vous que l'utilisateur anonyme la fonction définit l'état de la réponse et y écrit avant de renvoyer :

func(w http.ResponseWriter, r *http.Request) {
    fmt.Println(r.URL)
    w.Write([]byte("Hello, World!"))
    go HandleIndex(w, r)
}
Copier après la connexion

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