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!