Maison > développement back-end > Golang > Pourquoi l'utilisation de Goroutines avec « WriteHeader » dans le package « net/http » de Go provoque-t-elle « plusieurs appels de réponse.WriteHeader » ?

Pourquoi l'utilisation de Goroutines avec « WriteHeader » dans le package « net/http » de Go provoque-t-elle « plusieurs appels de réponse.WriteHeader » ?

Linda Hamilton
Libérer: 2024-12-28 19:02:11
original
407 Les gens l'ont consulté

Why Does Using Goroutines with `WriteHeader` in Go's `net/http` Package Cause

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

    ...
}
Copier après la connexion

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

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal