HTTP-Funktionshandler wird unerwartet aufgerufen
Bei der Verwendung von HTTP-Handlern in Go ist es wichtig zu verstehen, wie Anfragen verarbeitet werden. In einem häufigen Szenario stellt ein Browser nicht nur eine Anfrage an die Stamm-URL, sondern fordert zu visuellen Zwecken auch eine Symboldatei mit dem Namen „/favicon.ico“ an. Diese zusätzliche Anfrage kann dazu führen, dass eine Handler-Funktion zweimal aufgerufen wird.
Beispiel:
Betrachten Sie den folgenden Code, der bei jedem Seitenbesuch einen Zähler erhöht:
package main import ( "fmt" "io" "log" "net/http" ) var counter int func hello(w http.ResponseWriter, r *http.Request) { counter++ io.WriteString(w, fmt.Sprintf("Hello world! Counter: %d", counter)) log.Println("hello.") } func main() { mux := http.NewServeMux() mux.HandleFunc("/", hello) http.ListenAndServe(":8000", mux) }
Beobachtung:
Wenn Sie auf den Hafen zugreifen 8000 in einem Webbrowser, werden Sie feststellen, dass der „Hallo“-Handler zweimal aufgerufen wird. Dies liegt daran, dass der Browser auch eine Anfrage nach „/favicon.ico“ stellt. Wenn Sie cURL verwenden, um auf dieselbe URL zuzugreifen, wird der Handler nur einmal aufgerufen.
Um dieses Problem zu verstehen und zu beheben, protokollieren Sie einfach die Anfragen. Sie werden sehen, dass die zweite Anfrage für „/favicon.ico“ gilt. Um dies zu vermeiden, können Sie entweder:
Das Verständnis des HTTP-Anfrageflusses und die Berücksichtigung spezifischer Randfälle wird Ihnen beim Schreiben robuster und zuverlässiger Webserver helfen Los.
Das obige ist der detaillierte Inhalt vonWarum wird mein Go-HTTP-Funktionshandler zweimal aufgerufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!