Maison > développement back-end > Golang > Comment puis-je inspecter le corps d'une requête HTTP sans modifier l'état de la requête ?

Comment puis-je inspecter le corps d'une requête HTTP sans modifier l'état de la requête ?

Mary-Kate Olsen
Libérer: 2024-12-19 04:50:08
original
341 Les gens l'ont consulté

How Can I Inspect an HTTP Request Body Without Modifying the Request State?

Inspection du corps de la requête HTTP et maintien de l'état de la requête

Dans les implémentations de gestion HTTP, l'inspection du corps de la requête est essentielle pour le traitement de certaines requêtes, telles que les requêtes POST avec des données codées sous forme de formulaire . Cependant, une inspection directe à l'aide de méthodes telles que req.ParseForm() peut perturber l'état de la requête, entraînant des erreurs lors du transfert de la requête vers des proxys inverses.

Pour résoudre ce problème, il est possible de jeter un œil au corps de la requête sans quitter toute trace dans l’objet de requête d’origine. Cela maintient l'état d'origine pour les consommateurs suivants, tels que les proxys inverses.

Mise en œuvre

Une approche efficace consiste à lire le corps de la requête dans un tampon intermédiaire et à utiliser ce tampon pour créer plusieurs lecteurs. L'extrait de code ci-dessous le démontre :

// Read the request body into a buffer
buf, _ := io.ReadAll(r.Body)

// Create two readers from the buffer
rdr1 := io.NopCloser(bytes.NewBuffer(buf))
rdr2 := io.NopCloser(bytes.NewBuffer(buf))

// Perform desired operations on the first reader
doStuff(rdr1)

// Reset the request body with the second reader
r.Body = rdr2
Copier après la connexion

Dans ce code, bytes.NewBuffer(buf) crée des lecteurs qui encapsulent le tampon stocké. io.NopCloser garantit que la méthode Close() ne renvoie pas d'erreur, ce qui est nécessaire au lecteur pour implémenter l'interface io.ReadCloser.

Utilisation

L'extrait de code modifie le exemple fourni dans la question, où doStuff() est la fonction qui traite le corps de la requête :

buf, _ := io.ReadAll(r.Body)
rdr1 := io.NopCloser(bytes.NewBuffer(buf))
rdr2 := io.NopCloser(bytes.NewBuffer(buf))

doStuff(rdr1)
r.Body = rdr2
Copier après la connexion

Avec cette modification, le corps de la requête peut être inspecté sans affecter l’état initial de la demande. Le proxy inverse peut alors procéder au traitement de la demande avec le corps non modifié.

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