Consignation du corps de réponse dans le middleware Gin
Dans le middleware, vous devrez peut-être capturer et enregistrer le corps de la réponse à des fins de débogage ou d'audit. Alors, comment pouvons-nous accéder au corps de la réponse à partir du contexte middleware dans Gin ?
Gin gère l'écriture des réponses en interne, ce qui rend difficile l'obtention directe du corps. Pour surmonter cela, nous devons implémenter notre propre Writer qui intercepte les opérations d'écriture. Voici une approche étape par étape :
type bodyLogWriter struct { gin.ResponseWriter body *bytes.Buffer } func (w bodyLogWriter) Write(b []byte) (int, error) { w.body.Write(b) return w.ResponseWriter.Write(b) }
Cet rédacteur met en mémoire tampon le corps de la réponse tout en l'écrivant. à l'écrivain original.
func ginBodyLogMiddleware(c *gin.Context) { blw := &bodyLogWriter{body: bytes.NewBufferString(""), ResponseWriter: c.Writer} c.Writer = blw c.Next() statusCode := c.Writer.Status() if statusCode >= 400 { fmt.Println("Response body: " + blw.body.String()) } }
Dans le middleware, nous attribuons notre blw d'écrivain personnalisé au contexte, garantissant que toutes les réponses seront capturées par celui-ci. Ensuite, nous enregistrons le corps si le code d'état est une erreur.
router.Use(ginBodyLogMiddleware)
Maintenant, lorsque les demandes sont géré par votre routeur Gin, le middleware interceptera et enregistrera les corps de réponse pour les requêtes avec des codes d'état d'erreur.
Notez que cette approche n'enregistrera pas les corps de réponse pour les fichiers statiques, mais elle devrait répondre au cas d'utilisation de contenu le plus dynamique. Si vous devez intercepter tous les fichiers, vous aurez besoin d'un wrapper plus complexe autour du moteur Gin.
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!