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