In diesem Artikel wird ein alternativer Ansatz zum Erhalten der HTTP-Antwort für Protokollierungszwecke beschrieben, ohne auf gefälschte Anforderungen zurückzugreifen oder http.ResponseWriter zu ändern. Wir stellen das Konzept der Middleware-Verkettung vor und bieten eine Implementierung im funktionalen Stil.
Middleware-Verkettung beinhaltet die Übergabe der Kontrolle an eine Kette von Handlern, die bestimmte Aufgaben vor und nach der Ausführung der Hauptanforderung ausführen. Diese als Middleware bezeichneten Handler empfangen die Anfrage und den nächsten Handler in der Kette und sorgen so für eine geordnete Ausführung.
Wir definieren eine benutzerdefinierte Middleware-Funktion, die als HTTP-Handler-Kombinator fungiert:
<code class="go">func NewResponseLoggingHandler(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // Replace the response writer with a recorder for subsequent handlers c := httptest.NewRecorder() next(c, r) // Copy data from the recorder to the original response writer for k, v := range c.HeaderMap { w.Header()[k] = v } w.WriteHeader(c.Code) c.Body.WriteTo(w) } }</code>
Um die automatische Antwortprotokollierung für alle Handler in einer bestimmten Kategorie sicherzustellen, erstellen wir einen weiteren Handler-Kombinator, der die Protokollierungs-Middleware kapselt:
<code class="go">func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc { return NewResponseLoggingHandler(NewOtherStuffHandler(next)) }</code>
Jetzt wird jede Handler-Kette mit instanziiert NewDefaultHandler schließt automatisch die Antwortprotokollierung und andere Standardverhaltensweisen ein.
<code class="go">h := NewDefaultHandler(...)</code>
Mithilfe der Middleware-Verkettung können wir HTTP-Antworten transparent abfangen und protokollieren, ohne dass eine Anfrage gefälscht oder das http geändert werden muss. ResponseWriter. Dieser Ansatz ermöglicht eine modulare Protokollierung und vereinfacht die Handlerverwaltung.
Das obige ist der detaillierte Inhalt vonWie protokolliere ich HTTP-Antworten, ohne http.ResponseWriter zu ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!