"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment enregistrer les réponses HTTP sans modifier http.ResponseWriter ?

Comment enregistrer les réponses HTTP sans modifier http.ResponseWriter ?

Publié le 2024-11-09
Parcourir:172

How to Log HTTP Responses Without Modifying http.ResponseWriter?

Consignation de la réponse HTTP dans http.HandleFunc

Cet article traite d'une approche alternative pour obtenir la réponse HTTP à des fins de journalisation sans recourir à de fausses requêtes ou à modifier http.ResponseWriter. Nous introduisons le concept de chaînage de middleware, fournissant une implémentation de style fonctionnel.

Chaînage de middleware

Le chaînage de middleware implique de passer le contrôle à une chaîne de gestionnaires qui effectuent des tâches spécifiques avant et après l'exécution de la requête principale. Ces gestionnaires, appelés middleware, reçoivent la requête et le gestionnaire suivant dans la chaîne, garantissant une exécution ordonnée.

Nous définissons une fonction middleware personnalisée qui agit comme un combinateur de gestionnaire HTTP :

func NewResponseLoggingHandler(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // Replace the response writer with a recorder for subsequent handlers
        c := httptest.NewRecorder()
        next(c, r)

        // Copy data from the recorder to the original response writer
        for k, v := range c.HeaderMap {
            w.Header()[k] = v
        }
        w.WriteHeader(c.Code)
        c.Body.WriteTo(w)
    }
}

Application de la solution

Pour garantir la journalisation automatique des réponses pour tous les gestionnaires d'une catégorie spécifique, nous créons un autre combinateur de gestionnaires qui encapsule le middleware de journalisation :

func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc {
    return NewResponseLoggingHandler(NewOtherStuffHandler(next))
}

Désormais, toute chaîne de gestionnaires instanciée à l'aide de NewDefaultHandler inclura automatiquement la journalisation des réponses et d'autres comportements par défaut.

h := NewDefaultHandler(...)

Conclusion

Grâce au chaînage middleware, nous pouvons intercepter et enregistrer de manière transparente les réponses HTTP sans avoir besoin de falsifier la demande ou de modifier le http.ResponseWriter. Cette approche permet une journalisation modulaire et simplifie la gestion des gestionnaires.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3