Maison >développement back-end >Golang >Comment puis-je réutiliser les corps de requête HTTP dans le middleware Go-chi ?

Comment puis-je réutiliser les corps de requête HTTP dans le middleware Go-chi ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-04 16:54:15452parcourir

How Can I Reuse HTTP Request Bodies in Go-chi Middleware?

Réutilisabilité du corps de requête HTTP dans le middleware Go-chi

Lorsque vous travaillez avec Go-chi pour le routage HTTP, il est souvent nécessaire de réutiliser les corps de requête sur plusieurs gestionnaires. Cependant, un problème courant survient lorsque le corps de la requête ne peut être lu qu'une seule fois.

Par exemple, considérons le code suivant :

func Registration(w http.ResponseWriter, r *http.Request) {
    b, err := ioutil.ReadAll(r.Body) // read request body
    // ...other code
    user.Create(w, r)
}

...

func Create(w http.ResponseWriter, r *http.Request) {
  b, err := ioutil.ReadAll(r.Body)  
  // ...other code
}

Dans cet exemple, le gestionnaire d'inscription lit le corps de la requête. en utilisant ioutil.ReadAll. Lorsque le gestionnaire Create est invoqué, il tente de relire le corps, ce qui entraîne une fin inattendue de l'erreur d'entrée JSON.

Le problème fondamental ici est que le premier appel à ReadAll épuise le corps de la requête. Pour résoudre ce problème, le corps de la requête doit être restauré avec les données précédemment lues. Le code suivant montre comment :

func Registration(w http.ResponseWriter, r *http.Request) {
    b, err := io.ReadAll(r.Body) 
    // ...other code
    r.Body = io.NopCloser(bytes.NewReader(b))
    user.Create(w, r)
}

Dans ce code révisé, io.ReadAll est utilisé pour lire le corps de la requête, puis le corps de la requête est restauré avec les fonctions bytes.NewReader et io.NopCloser avant d'appeler utilisateur.Créer. Cela rend effectivement le corps de la demande disponible pour les gestionnaires suivants.

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