Maison >développement back-end >Golang >Comment réutiliser les données du corps de la requête HTTP dans les gestionnaires de middleware Go-chi ?

Comment réutiliser les données du corps de la requête HTTP dans les gestionnaires de middleware Go-chi ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-08 15:24:12284parcourir

How to Reuse HTTP Request Body Data Across Go-chi Middleware Handlers?

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

Lorsque vous utilisez go-chi pour le routage HTTP, il est pratique de réutiliser le code dans plusieurs gestionnaires. Cependant, cela peut entraîner des problèmes inattendus si les gestionnaires s'appuient sur les données du corps de la demande.

Considérez le scénario 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 cet exemple, les gestionnaires d'inscription et de création tentent de lire le corps de la requête en utilisant ioutil.ReadAll. Cependant, puisque Registration lit le corps jusqu'à la fin, il n'y a plus de données à lire lorsque Create est appelé.

Pour résoudre ce problème, le gestionnaire externe (Registration) doit restaurer le corps de la requête avec les données lues précédemment. Ceci peut être réalisé en utilisant le code suivant :

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

Ici, la fonction bytes.NewReader() renvoie un io.Reader sur une tranche d'octets, tandis que la fonction io.NopCloser convertit ce lecteur en io. Interface ReadCloser requise pour r.Body. En réinitialisant r.Body avec les données d'origine, Create peut désormais accéder et analyser le corps de la requête 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!

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