Maison > développement back-end > Golang > Comment enregistrer les réponses HTTP en temps réel avec « http.HandleFunc » et un middleware ?

Comment enregistrer les réponses HTTP en temps réel avec « http.HandleFunc » et un middleware ?

DDD
Libérer: 2024-10-27 10:29:03
original
358 Les gens l'ont consulté

How to Log Real-Time HTTP Responses with `http.HandleFunc` and Middleware?

Consignation des requêtes HTTP entrantes avec http.HandleFunc

Dans notre discussion précédente, nous avons exploré l'inspection des réponses HTTP à l'aide d'une fausse requête, une technique adaptée aux tests unitaires. Cependant, nous cherchons également un moyen d'enregistrer les données de réponse en temps réel sur un serveur en direct.

Chaînage de middleware

Une approche répandue consiste à créer une chaîne de middleware. Les bibliothèques comme Negroni offrent des fonctionnalités middleware, dans lesquelles les gestionnaires sont combinés et exécutés séquentiellement. Une implémentation minimale de middleware peut être réalisée à l'aide de combinateurs de gestionnaires :

<code class="go">func NewFooHandler(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // Do pre-handling tasks
        next(w, r)
        // Do post-handling tasks
    }
}</code>
Copier après la connexion

Ces combinateurs peuvent ensuite être chaînés pour former un gestionnaire :

<code class="go">h := NewFooHandler(NewBarHandler(NewBazHandler(Sink)))</code>
Copier après la connexion

Application à HTTP.HandleFunc

Pour appliquer cette technique à votre problème, vous pouvez créer un combinateur de gestionnaire :

<code class="go">func NewResponseLoggingHandler(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // Record the response
        c := httptest.NewRecorder()
        next(c, r)
        
        // Copy responses
        for k, v := range c.HeaderMap {
            w.Header()[k] = v
        }
        w.WriteHeader(c.Code)
        c.Body.WriteTo(w)
    }
}</code>
Copier après la connexion

Maintenant, vous pouvez créer un gestionnaire par défaut qui combine des gestionnaires personnalisés avec la journalisation des réponses :

<code class="go">func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc {
    return NewResponseLoggingHandler(NewOtherStuffHandler(next))
}</code>
Copier après la connexion

En utilisant ce gestionnaire par défaut :

<code class="go">h := NewDefaultHandler(...)</code>
Copier après la connexion

Tous les gestionnaires suivants incluront automatiquement la journalisation des réponses.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal