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
Susan Sarandonoriginal
2024-12-05 11:19:10347parcourir

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
}

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)
}

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!

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