Heim >Backend-Entwicklung >Golang >Warum wird mein Go „HandleFunc' zweimal aufgerufen, wenn ich einen Webbrowser verwende?
Unerwarteter doppelter Aufruf von HttpHandler: HandleFunc
Einführung
Bei Verwendung von http.ServeMux Multiplexer in einem Go-Webserver wurde festgestellt, dass eine registrierte Handlerfunktion vorliegt (HandleFunc) wird für jede von einem Webbrowser gestellte Anfrage zweimal aufgerufen. Dieses Verhalten widerspricht der beabsichtigten Funktionalität.
Problem
Bei der Implementierung eines einfachen Webservers mit einer Handlerfunktion, die einen Zähler erhöht, wurde beobachtet, dass der Zähler erhöht wird zweimal für jede Browseranfrage. Bei Verwendung von Curl wird der Handler jedoch wie erwartet nur einmal aufgerufen.
Ursache
Nach der Protokollierung der Anfragen wird deutlich, dass der Browser auch eine Anfrage für sendet /favicon.ico. Hierbei handelt es sich um eine Anforderung für ein kleines Symbol, das normalerweise in der Adressleiste oder im Tab des Browsers angezeigt wird. Da der ServeMux-Multiplexer standardmäßig alle URLs abgleicht, ruft er den registrierten Handler für diese zusätzliche Anfrage auf, was zu einem doppelten Aufruf führt.
Lösung
Um zu verhindern, dass der Handler dies tut Für den Aufruf von favicon.ico gibt es zwei Ansätze berücksichtigt:
Einen spezifischen favicon.ico-Handler hinzufügen:
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) }
Durch die Definition eines separaten Handlers für / favicon.ico, der Hello-Handler wird nur für die reguläre Seite aufgerufen Anfragen.
Überspringen Sie den Handler für Standardmuster:
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/" { hello(w, r) } })
Dieser Ansatz überprüft den URL.Pfad von die Anfrage und stellt sicher, dass der Hello-Handler nur aufgerufen wird, wenn der Pfad genau /.
istDas obige ist der detaillierte Inhalt vonWarum wird mein Go „HandleFunc' zweimal aufgerufen, wenn ich einen Webbrowser verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!