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

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

Susan Sarandon
Libérer: 2024-12-05 11:19:10
original
351 Les gens l'ont consulté

How Can I Reuse an HTTP Request Body in Go Middleware Handlers?

Réutilisation du corps de la requête HTTP dans les gestionnaires de middleware Go

Dans le package net/http de Go, les gestionnaires de middleware offrent un moyen pratique de traiter et de modifier les Requêtes HTTP avant traitement par le code de l'application réel. Cependant, un défi courant survient lorsqu'un gestionnaire de middleware doit réutiliser le corps de la requête qui a déjà été lu par un gestionnaire précédent.

Considérez l'extrait de code suivant :

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

Dans ce scénario , le gestionnaire d'enregistrement lit le corps de la requête dans la variable b et transmet la requête r au gestionnaire user.Create, qui tente de lire à nouveau le corps. Cependant, cela entraîne une erreur car le corps a déjà été consommé par le gestionnaire d'enregistrement.

La solution à ce problème est simple : restaurez le corps de la requête dans le gestionnaire externe après sa lecture. Ceci peut être réalisé en utilisant les fonctions bytes.NewReader() et io.NopCloser :

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

La fonction bytes.NewReader() crée un io.Reader à partir d'une tranche d'octets et io.NopCloser convertit un io. .Reader au type io.ReadCloser requis pour r.Body. En restaurant le corps, les gestionnaires suivants peuvent accéder aux données de la demande d'origine.

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