Maison  >  Article  >  développement back-end  >  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
DDDoriginal
2024-10-27 10:29:03319parcourir

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>

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

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

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>

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>

En utilisant ce gestionnaire par défaut :

<code class="go">h := NewDefaultHandler(...)</code>

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!

Déclaration:
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