Heim >Backend-Entwicklung >Golang >Wie können Sie HTTP-Antworten in „http.HandleFunc' von Go mithilfe von Middleware-Verkettung und funktionalen Handler-Kombinatoren protokollieren?
Im vorherigen Artikel mit dem Titel „In go, wie man das HTTP überprüft Antwort, die an http.ResponseWriter geschrieben wird?“ Wir haben eine Methode zur Überprüfung von Serverantworten in einer Unit-Test-Umgebung untersucht. Allerdings ist dieser Ansatz möglicherweise nicht für Live-Server geeignet.
Eine alternative Lösung ist Middleware Chaining, eine häufig verwendete Technik zum Ändern und Protokollieren von HTTP Antworten und Anfragen unter Beibehaltung des ursprünglichen Anfrage-Antwort-Flusses.
Anstatt eine Bibliothek wie negroni zu verwenden, können wir unseren eigenen funktionalen Handler erstellen Kombinatoren:
<code class="go">func NewFooHandler(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // do something before next(w, r) // do something after } }</code>
Wir können mehrere Handler mithilfe der Kombinatoren miteinander verketten:
<code class="go">h := NewFooHandler(NewBarHandler(NewBazHandler(Sink)))</code>
In In diesem Beispiel ist Sink ein leerer Handler, der nichts tut.
Mit dem Handler-Kombinator-Ansatz können wir einen Handler erstellen, der die Antwort protokolliert :
<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 c := httptest.NewRecorder() next(c, r) // Copy the response from the recorder to the actual writer for k, v := range c.HeaderMap { w.Header()[k] = v } w.WriteHeader(c.Code) c.Body.WriteTo(w) } }</code>
Wir können den Antwortprotokollierungs-Handler auf alle HTTP-Routen anwenden, indem wir einen Standard-Handler-Kombinator erstellen:
<code class="go">func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc { return NewResponseLoggingHandler(NewOtherStuffHandler(next)) }</code>
Auf diese Weise werden immer dann, wenn wir eine Kette wie folgt starten:
<code class="go">h := NewDefaultHandler(...)</code>
Sie automatisch die Antwortprotokollierung und alle anderen Standardhandler einschließen.
Das obige ist der detaillierte Inhalt vonWie können Sie HTTP-Antworten in „http.HandleFunc' von Go mithilfe von Middleware-Verkettung und funktionalen Handler-Kombinatoren protokollieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!