Maison > développement back-end > Golang > Comment réutiliser les corps de requête HTTP dans les gestionnaires de middleware Go Chi ?

Comment réutiliser les corps de requête HTTP dans les gestionnaires de middleware Go Chi ?

Barbara Streisand
Libérer: 2024-12-05 02:58:08
original
742 Les gens l'ont consulté

How to Reuse HTTP Request Bodies in Go Chi Middleware Handlers?

Réutilisation des corps de requête HTTP dans les gestionnaires de middleware Go Chi

Dans Go, lorsque vous utilisez le routeur HTTP go-chi, vous pouvez rencontrer une situation où vous devez réutiliser le corps de la requête dans plusieurs gestionnaires de middleware. L'extrait de code suivant illustre un scénario dans lequel ce problème survient :

func Registration(w http.ResponseWriter, r *http.Request) {
    b, err := ioutil.ReadAll(r.Body) // if you delete this line, the user will be created   
    // ...other code

    // if all good then create new user
    user.Create(w, r)
}

...

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

  // ... there I get the problem with parse JSON from &b
}
Copier après la connexion

Le gestionnaire d'inscription tente de lire le corps de la demande et de le traiter. Cependant, après cette étape, lorsque le gestionnaire Create est appelé, il ne parvient pas à analyser le JSON du corps de la requête car celui-ci est vide. Cela se produit parce que le gestionnaire externe lit le corps de la requête jusqu'à la fin, ne laissant rien à lire pour le gestionnaire interne.

Pour résoudre ce problème, le corps de la requête doit être restauré en restaurant les données lues précédemment dans le gestionnaire externe. . L'extrait de code suivant montre comment y parvenir :

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

Dans ce code, la fonction bytes.NewReader renvoie un io.Reader sur une tranche d'octets. La fonction io.NopCloser, à son tour, convertit le io.Reader en io.ReadCloser requis pour r.Body. En restaurant le corps de la requête, les gestionnaires suivants peuvent accéder à son contenu et le traiter comme prévu.

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