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