Lorsque vous travaillez avec Go-chi pour le routage HTTP, il est souvent nécessaire de réutiliser les corps de requête sur plusieurs gestionnaires. Cependant, un problème courant survient lorsque le corps de la requête ne peut être lu qu'une seule fois.
Par exemple, considérons le code suivant :
func Registration(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // read request body // ...other code user.Create(w, r) } ... func Create(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // ...other code }
Dans cet exemple, le gestionnaire d'inscription lit le corps de la requête. en utilisant ioutil.ReadAll. Lorsque le gestionnaire Create est invoqué, il tente de relire le corps, ce qui entraîne une fin inattendue de l'erreur d'entrée JSON.
Le problème fondamental ici est que le premier appel à ReadAll épuise le corps de la requête. Pour résoudre ce problème, le corps de la requête doit être restauré avec les données précédemment lues. Le code suivant montre comment :
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 révisé, io.ReadAll est utilisé pour lire le corps de la requête, puis le corps de la requête est restauré avec les fonctions bytes.NewReader et io.NopCloser avant d'appeler utilisateur.Créer. Cela rend effectivement le corps de la demande disponible pour les gestionnaires suivants.
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!