Lecture du corps de la requête plusieurs fois dans le middleware Go-Gin
Lors de la validation des données du corps de la requête dans le middleware Go-Gin, il est nécessaire d'accéder au corps plusieurs fois. Cependant, lire et manipuler le corps peut conduire à des comportements inattendus. Cet article aborde la question de savoir comment lire le corps de la requête plusieurs fois dans le middleware de validation, garantissant ainsi l'intégrité des données tout au long du cycle de la requête HTTP.
Problème :
Un développeur rencontré une situation où ils devaient valider les données du corps de la demande et conserver les informations validées pour un traitement ultérieur. Cependant, l'utilisation de c.ShouldBindJSON() pour lire le corps dans une structure entraînait que les tentatives ultérieures de lecture du corps renvoyaient une réponse vide.
// SignupValidator Middleware func SignupValidator(c *gin.Context) { var user entity.User if err := c.ShouldBindJSON(&user); err != nil { // Validation logic } // Subsequent read attempt bodyBytes, _ := ioutil.ReadAll(c.Request.Body) fmt.Println(string(bodyBytes)) // Empty response }
Solution :
Pour conserver le corps de la requête et permettre plusieurs lectures, il est recommandé d'utiliser la technique ByteBody. Cela implique de lire le corps dans un tampon, qui peut être utilisé sans affecter les requêtes ultérieures.
// SignupValidator Middleware func SignupValidator(c *gin.Context) { byteBody, _ := ioutil.ReadAll(c.Request.Body) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(byteBody)) var user entity.User if err := c.ShouldBindJSON(&user); err != nil { // Validation logic } c.Next() }
Avec cette solution, byteBody contient les données du corps, accessibles plusieurs fois selon les besoins. L'appel à ioutil.NopCloser() crée un nouveau lecteur qui ne ferme pas le tampon sous-jacent, permettant des lectures ultérieures sans effets secondaires.
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!