Heim > Backend-Entwicklung > Golang > Warum wird mein Go „HandleFunc' zweimal aufgerufen, wenn ich einen Webbrowser verwende?

Warum wird mein Go „HandleFunc' zweimal aufgerufen, wenn ich einen Webbrowser verwende?

Mary-Kate Olsen
Freigeben: 2024-12-15 08:21:18
Original
246 Leute haben es durchsucht

Why is my Go `HandleFunc` called twice when using a web browser?

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:

  1. 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)
    }
    Nach dem Login kopieren

Durch die Definition eines separaten Handlers für / favicon.ico, der Hello-Handler wird nur für die reguläre Seite aufgerufen Anfragen.

  1. Überspringen Sie den Handler für Standardmuster:

    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path == "/" {
        hello(w, r)
    }
    })
    Nach dem Login kopieren

Dieser Ansatz überprüft den URL.Pfad von die Anfrage und stellt sicher, dass der Hello-Handler nur aufgerufen wird, wenn der Pfad genau /.

ist

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

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage