Heim >Backend-Entwicklung >Golang >Wie können Sie HTTP-Antworten in „http.HandleFunc' von Go mithilfe von Middleware-Verkettung und funktionalen Handler-Kombinatoren protokollieren?

Wie können Sie HTTP-Antworten in „http.HandleFunc' von Go mithilfe von Middleware-Verkettung und funktionalen Handler-Kombinatoren protokollieren?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-28 04:41:30879Durchsuche

How can you log HTTP responses in Go's `http.HandleFunc` using middleware chaining and functional handler combinators?

Antworten auf eingehende HTTP-Anfragen in http.HandleFunc 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.

Middleware Chaining

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.

Functional Handler Combinators

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>

Erstellen einer Kette von Handlern

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.

Antwortprotokollierung implementieren

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>

Anwenden des Antwortprotokollierungs-Handlers

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn