Maison >développement back-end >Golang >Pourquoi mon Go `HandleFunc` est-il appelé deux fois lors de l'utilisation d'un navigateur Web ?
Double invocation inattendue de HttpHandler : HandleFunc
Introduction
Lors de l'utilisation de http.ServeMux multiplexeur dans un serveur web Go, on observe qu'une fonction de gestionnaire enregistré (HandleFunc) est invoqué deux fois pour chaque requête effectuée à partir d'un navigateur Web. Ce comportement est contraire à la fonctionnalité prévue.
Problème
Lors de l'implémentation d'un serveur Web de base avec une fonction de gestionnaire qui incrémente un compteur, on observe que le compteur est incrémenté deux fois pour chaque requête du navigateur. Cependant, lors de l'utilisation de curl, le gestionnaire n'est invoqué qu'une seule fois comme prévu.
Cause
Après avoir enregistré les requêtes, il devient évident que le navigateur envoie également une requête pour /favicon.ico. Il s'agit d'une demande pour une petite icône qui est généralement affichée dans la barre d'adresse ou l'onglet du navigateur. Comme le multiplexeur ServeMux correspond à toutes les URL par défaut, il appelle le gestionnaire enregistré pour cette requête supplémentaire, ce qui entraîne une double invocation.
Solution
Pour empêcher le gestionnaire de étant invoqué pour la requête favicon.ico, deux approches peuvent être considéré :
Ajouter un gestionnaire favicon.ico spécifique :
func favicon(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "favicon.ico") } func main() { mux := http.NewServeMux() mux.HandleFunc("/", hello) mux.HandleFunc("/favicon.ico", favicon) http.ListenAndServe(":8000", mux) }
En définissant un gestionnaire distinct pour / favicon.ico, le gestionnaire hello ne sera invoqué que pour la page normale requêtes.
Ignorer le gestionnaire pour les modèles par défaut :
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/" { hello(w, r) } })
Cette approche vérifie l'URL.Chemin de la requête et garantit que le gestionnaire hello est invoqué uniquement lorsque le chemin est exactement /.
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!