Mehrere WriteHeader-Aufrufe in einem einfachen HTTP-Server
Ein einfacher HTTP-Server, der in Go mithilfe des Pakets net/http implementiert wurde, zeigt ungewöhnliches Verhalten, da angezeigt durch die Fehlermeldung:
http: multiple response.WriteHeader calls
Dieser Fehler deutet darauf hin, dass der Server versucht, den Antwortheader mehrmals zu schreiben, was nicht zulässig ist durch die HTTP-Spezifikation. Analysieren wir den Code, um zu verstehen, warum dieses Problem auftritt:
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!")) }
Analyse
Das Hauptproblem liegt in der anonymen Funktion, die als Handler für eingehende Anfragen registriert ist:
func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }
Diese Funktion gibt die Anforderungs-URL aus und startet eine neue Goroutine zum Aufrufen von HandleIndex(). Anschließend wird die Ausführung normal fortgesetzt.
Wenn die Handlerfunktion den Antwortstatus nicht festlegt oder nichts in die Antwort schreibt, setzt Go den Status automatisch auf 200 (HTTP OK) und kehrt zurück. Dieses Verhalten gilt für die anonyme Funktion in unserem Code, die den Antwortstatus nicht explizit festlegt oder vor der Zeile „go HandleIndex(w, r)“ darauf schreibt.
Wenn HandleIndex() in einer separaten Funktion aufgerufen wird goroutine, die anonyme Funktion setzt ihre Ausführung fort und endet mit der Bearbeitung der Anfrage. Da der Antwortstatus nicht zuvor festgelegt wurde, setzt Go ihn automatisch auf 200 HTTP OK. Die erzeugte Goroutine versucht jedoch auch, den Antwortstatus innerhalb von HandleIndex() festzulegen, was zum Fehler „mehrere Response.WriteHeader-Aufrufe“ führt.
Lösung
An Um dieses Problem zu vermeiden, entfernen Sie entweder das Schlüsselwort „go“ aus der Zeile, die die Goroutine startet:
func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) HandleIndex(w, r) }
oder stellen Sie sicher, dass die anonyme Funktion die Antwort festlegt Status und schreibt darauf, bevor es zurückkehrt:
func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) w.Write([]byte("Hello, World!")) go HandleIndex(w, r) }
Das obige ist der detaillierte Inhalt vonWarum erhalte ich auf meinem Go-HTTP-Server den Fehler „http: multiple Response.WriteHeader-Aufrufe'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!