Schreiben mehrerer Header in einem einfachen Go-HTTP-Programm
Ein häufiges Problem im Net/http-Paket von Go ist der Fehler „Mehrfachantwort“. WriteHeader-Aufrufe.“ Dies tritt auf, wenn mehrere Header in dieselbe HTTP-Antwort geschrieben werden.
Beachten Sie den folgenden Codeausschnitt:
import ( "fmt" "log" "net/http" ) 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!")) }
Bei Ausführung und Zugriff über localhost:5678 in Chrome zeigt die Konsole Folgendes an:
Starting Server... / 2015/01/15 13:41:29 http: multiple response.WriteHeader calls /favicon.ico 2015/01/15 13:41:29 http: multiple response.WriteHeader calls
Ursache für das Schreiben mehrerer Header
Der Schlüssel Dieser Fehler liegt in der anonymen Funktion, die als Anforderungshandler verwendet wird:
func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }
Diese Funktion gibt die URL aus, erzeugt eine neue Goroutine, die HandleIndex() aufruft, und setzt die Ausführung fort. Wenn eine Handler-Funktion vor dem ersten Write-Aufruf keinen Antwortstatus setzt, setzt Go diesen automatisch auf 200 (HTTP OK). Wenn der Handler jedoch fertig wird, ohne in die Antwort zu schreiben, setzt Go den Status trotzdem auf 200.
In diesem Fall setzt die anonyme Funktion keinen Status und schreibt nichts, also setzt Go den Status auf 200.
Goroutine und Schreiben mehrerer Header
Wenn HandleIndex() in einer separaten Goroutine aufgerufen wird, wird die Die ursprüngliche anonyme Funktion vervollständigt und legt den Antwortheader fest. In der Zwischenzeit setzt die neue Goroutine auch den Header, was zu dem Fehler führt.
Lösung
Um diesen Fehler zu beheben, entfernen Sie entweder das Schlüsselwort go, um darin HandleIndex() aufzurufen die ursprüngliche Goroutine oder legen Sie den Antwortstatus explizit innerhalb der anonymen Funktion fest.
Das obige ist der detaillierte Inhalt vonWarum zeigt mein Go-HTTP-Programm „http: multiple Response.WriteHeader-Aufrufe' an?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!