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

Patricia Arquette
Freigeben: 2024-10-28 04:41:30
Original
782 Leute haben es durchsucht

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>
Nach dem Login kopieren

Erstellen einer Kette von Handlern

Wir können mehrere Handler mithilfe der Kombinatoren miteinander verketten:

<code class="go">h := NewFooHandler(NewBarHandler(NewBazHandler(Sink)))</code>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Auf diese Weise werden immer dann, wenn wir eine Kette wie folgt starten:

<code class="go">h := NewDefaultHandler(...)</code>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!