Maison > développement back-end > Golang > le corps du texte

Comment pouvez-vous enregistrer les réponses HTTP dans « http.HandleFunc » de Go à l'aide du chaînage de middleware et des combinateurs de gestionnaires fonctionnels ?

Patricia Arquette
Libérer: 2024-10-28 04:41:30
original
782 Les gens l'ont consulté

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

Consignation des réponses aux requêtes HTTP entrantes dans http.HandleFunc

Dans l'article précédent intitulé "En go, comment inspecter le HTTP réponse écrite dans http.ResponseWriter ?" nous avons exploré une méthode d'inspection des réponses du serveur dans un environnement de tests unitaires. Cependant, cette approche peut ne pas convenir aux serveurs en direct.

Middleware Chaining

Une solution alternative est le middleware chaînage, une technique couramment utilisée pour modifier et enregistrer HTTP. réponses et requêtes tout en préservant le flux requête-réponse d'origine.

Combinateurs de gestionnaires fonctionnels

Au lieu d'utiliser une bibliothèque comme negroni, nous pouvons créer notre propre gestionnaire fonctionnel combinateurs :

<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>
Copier après la connexion

Création d'une chaîne de gestionnaires

Nous pouvons enchaîner plusieurs gestionnaires ensemble à l'aide des combinateurs :

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

Dans Dans cet exemple, Sink est un gestionnaire vide qui ne fait rien.

Implémentation de la journalisation des réponses

En utilisant l'approche combinateur de gestionnaire, nous pouvons créer un gestionnaire qui enregistre la réponse :

<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>
Copier après la connexion

Application du gestionnaire de journalisation des réponses

Nous pouvons appliquer le gestionnaire de journalisation des réponses à toutes les routes HTTP en créant un combinateur de gestionnaire par défaut :

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

De cette façon, chaque fois que nous démarrons une chaîne comme :

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

Elle inclura automatiquement la journalisation des réponses et tout autre gestionnaire par défaut.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!