Maison > développement back-end > Golang > Comment lire le corps de la requête plusieurs fois dans le middleware Go-Gin ?

Comment lire le corps de la requête plusieurs fois dans le middleware Go-Gin ?

Patricia Arquette
Libérer: 2024-12-15 09:12:14
original
867 Les gens l'ont consulté

How to Read the Request Body Multiple Times in Go-Gin Middleware?

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
}
Copier après la connexion

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()
}
Copier après la connexion

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!

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