Maison > développement back-end > Golang > Pourquoi le programme HTTP My Go affiche-t-il « http : appels à réponses multiples.WriteHeader » ?

Pourquoi le programme HTTP My Go affiche-t-il « http : appels à réponses multiples.WriteHeader » ?

Patricia Arquette
Libérer: 2024-12-09 19:06:23
original
961 Les gens l'ont consulté

Why Does My Go HTTP Program Show

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

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

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

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!

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