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 ?
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.
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.
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>
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.
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>
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!