Maison >développement back-end >Golang >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 ?

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
Patricia Arquetteoriginal
2024-10-28 04:41:30881parcourir

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>

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>

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>

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>

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

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

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!

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