Mehrere WriteHeader-Aufrufe im HTTP-Handler von Go
In einem einfachen Go-Programm mit einem Net/http-Server stößt ein Entwickler auf die „Mehrfachantwort“. Fehler „.WriteHeader ruft auf“ beim Versuch, HTTP-Anfragen zu verarbeiten. Der Fehler tritt auf, wenn das Programm eine Goroutine zum Ausführen der HandleIndex-Funktion enthält, obwohl die Handler-Funktion so konzipiert ist, dass sie einmal einen Header schreibt und einen statischen Text bereitstellt.
Erklärung des Fehlers
Die anonyme Funktion, die für die Bearbeitung eingehender Anfragen zuständig ist, druckt die URL, initiiert die HandleIndex-Funktion in einer neuen Goroutine und fährt mit der Ausführung fort. Wenn eine Handlerfunktion das Festlegen des Antwortstatus vor dem ersten Aufruf von Write versäumt, setzt Go den Status automatisch auf 200 (HTTP OK). Wenn die Handlerfunktion außerdem keinen Inhalt in die Antwort schreibt (und den Antwortstatus nicht festlegt und normal abschließt), wird dies als erfolgreiche Anforderungsverarbeitung behandelt, was zu einem Antwortstatus von 200 führt.
In diesem Fall setzt die anonyme Funktion den Antwortstatus nicht und schreibt nichts in die Antwort. Daher setzt Go den Antwortstatus auf 200 HTTP OK. Da jede Anfrage in einer eigenen Goroutine verarbeitet wird, setzt die ursprüngliche anonyme Funktion die Ausführung fort, wenn HandleIndex in einer neuen Goroutine aufgerufen wird, einschließlich der Festlegung des Antwortheaders. Gleichzeitig setzt die neu gestartete Goroutine auch den Antwortheader, was den Fehler „Mehrere Response.WriteHeader-Aufrufe“ verursacht.
Lösung: Entfernen der Goroutine
Durch Eliminieren der Mit dem Schlüsselwort „go“ wird HandleIndex in derselben Goroutine wie die Handler-Funktion aufgerufen, um sicherzustellen, dass der Antwortheader festgelegt ist, bevor die Handler-Funktion zurückkehrt. Dadurch wird verhindert, dass das Paket „net/http“ versucht, den Antwortheader erneut festzulegen, wodurch der Fehler behoben wird.
Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung von Goroutinen zu „mehreren Response.WriteHeader-Aufrufen' in den HTTP-Handlern von Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!