Maison  >  Article  >  développement back-end  >  Comment lire JSON à partir du corps de la requête en Go sans perdre son contenu ?

Comment lire JSON à partir du corps de la requête en Go sans perdre son contenu ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-02 08:43:02139parcourir

How to Read JSON from the Request Body in Go Without Losing its Content?

Lecture JSON à partir du corps de la requête dans Go

Lors du traitement des requêtes HTTP dans une application Web, la capture du corps de la requête est essentielle pour de nombreuses opérations. Avec Go, il existe plusieurs approches pour accomplir cette tâche.

Considérez le scénario suivant : vous devez récupérer le corps JSON brut d'une requête POST et le stocker dans une base de données. Pour ce faire, l'état d'origine du corps doit être préservé.

Le problème :

Tenter de décoder directement le corps à l'aide de json.NewDecoder ou de le lier à une structure peut conduire à des résultats vides ou à des erreurs en raison de la nature du http.Request.Body en tant que tampon qui ne peut pas être lu plusieurs fois.

La solution :

Pour capturer le corps de la requête tout en conservant son état d'origine, voici une solution étape par étape :

  1. Lire le contenu du corps : Utilisez ioutil.ReadAll pour lire le contenu du corps dans un octet array.
  2. Restaurer le corps : Créez un nouveau ioutil.NopCloser autour du tableau d'octets et attribuez-le à nouveau à context.Request().Body.
  3. Poursuivre le traitement : Vous pouvez maintenant continuer à utiliser le corps de la requête, par exemple en le liant à une structure ou en effectuant d'autres opérations.

Exemple de code :

<code class="go">// Read the Body content
var bodyBytes []byte
if context.Request().Body != nil {
    bodyBytes, _ = ioutil.ReadAll(context.Request().Body)
}

// Restore the io.ReadCloser to its original state
context.Request().Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))

// Continue to use the Body, like Binding it to a struct:
order := new(models.GeaOrder)
error := context.Bind(order)</code>

Sources :

  • http://grokbase.com/t/gg/golang-nuts/12adq8a2ys/go-nuts-re-reading-http -response-body-or-any-reader
  • https://medium.com/@xoen/golang-read-from-an-io-readwriter-without-loosing-its-content-2c6911805361

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