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.
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 gestionnaires HTTP :
<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 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) } }</code>
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 :
<code class="go">func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc { return NewResponseLoggingHandler(NewOtherStuffHandler(next)) }</code>
Maintenant, toute chaîne de gestionnaires instanciée à l'aide NewDefaultHandler inclura automatiquement la journalisation des réponses et d'autres comportements par défaut.
<code class="go">h := NewDefaultHandler(...)</code>
En utilisant le 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. RéponseWriter. Cette approche permet une journalisation modulaire et simplifie la gestion des gestionnaires.
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!