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!