Maison >développement back-end >Golang >Comment lire le corps d'une requête Go-Gin plusieurs fois ?

Comment lire le corps d'une requête Go-Gin plusieurs fois ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-28 17:04:11943parcourir

How to Read a Go-Gin Request Body Multiple Times?

Go-Gin : lecture du corps de la demande plusieurs fois

Dans Go-Gin, la lecture du corps de la demande peut être délicate si vous devez y accéder cela plusieurs fois. Le problème survient lorsque le middleware modifie le corps de la requête, ce qui rend l'accès ultérieur difficile.

Considérez le scénario suivant : vous disposez d'un middleware de validation qui lit le corps pour validation, suivi d'un autre gestionnaire qui nécessite le corps non modifié. Dans ce cas, les modifications du middleware interfèrent avec l'accès ultérieur du gestionnaire au corps d'origine.

Pour résoudre ce problème, vous pouvez utiliser l'approche suivante :

  1. Lire le corps de la requête dans une variable avant de la passer au middleware :
bodyBytes, _ := ioutil.ReadAll(c.Request.Body)
  1. Passez la variable body au middleware et effectuez la validation dessus :
if err := c.ShouldBindJSON(&user); err != nil {
    // Validation logic
}
  1. Après validation, restaurez le corps d'origine à l'aide de io.NopCloser :
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(ByteBody))
  1. Maintenant, la variable bodyBytes contient le corps d'origine non modifié et vous pouvez l'utiliser dans les gestionnaires suivants sans aucun problème.

Pour implémentez cette solution dans le code fourni, remplacez les lignes suivantes dans le middleware :

// var bodyBytes []byte
// if c.Request.Body != nil {
//  bodyBytes, _ = ioutil.ReadAll(c.Request.Body)
// }

par :

bodyBytes, _ := ioutil.ReadAll(c.Request.Body)
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))

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!

Déclaration:
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