Maison  >  Article  >  développement back-end  >  Comment récupérer des données JSON à partir d'un corps de requête dans Go ?

Comment récupérer des données JSON à partir d'un corps de requête dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-31 10:34:06435parcourir

How to Retrieve JSON Data from a Request Body in Go?

Récupération JSON d'un corps de requête dans Go

Lorsque vous travaillez avec des requêtes POST contenant du contenu JSON, il devient nécessaire d'extraire les données JSON du corps de la demande. Cependant, cela peut être une tâche déroutante pour les débutants Go qui migrent du code à partir de langages comme Node.js.

Pour résoudre ce problème, plusieurs approches ont été tentées :

var v interface{}<br>err := json.NewDecoder(context.Request().Body).Decode(&v)<br>if err != nil {</p>
<pre class="brush:php;toolbar:false">return result, err

}
fmt .Println(v)

Dans cet exemple, le résultat sera souvent vide, indiquant que le corps est vide. En effet, http.Request.Body est un tampon et une fois les données lues, elles ne peuvent plus être lues.

Une autre approche est :

m := echo .Map{}<br>if err := context.Bind(&m); err != nil {</p>
<pre class="brush:php;toolbar:false">return result, err

}
fmt.Println(m)

Ici, le code entraîne un message d'erreur de "EOF ". Cette erreur se produit car il n'y a pas d'en-tête de type de contenu dans la requête, donc Echo ne peut pas déterminer le type de données envoyées.

Enfin, une tentative de lecture directe du corps :

< pre>body, error := ioutil.ReadAll(context.Request().Body)
if error != nil {

return result, error

}
fmt.Println(body)

Résultat dans un tableau vide d'octets, car ioutil.ReadAll() consomme le corps de la requête.

La solution réside dans la compréhension de la nature de http.Request.Body comme un tampon et trouver un moyen de le restaurer après lecture. L'extrait de code suivant fournit une solution de contournement :

// Lire le contenu du corps<br>var bodyBytes []byte<br>if context.Request().Body != nil {</p> <pre class="brush:php;toolbar:false">bodyBytes, _ = ioutil.ReadAll(context.Request().Body)

}

// Restaurer le io.ReadCloser à son état d'origine
context.Request().Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))

// Continuer à utiliser le corps, comme le lier à une structure :
order := new(models.GeaOrder)
error := context.Bind(order)

Avec cette solution de contournement, il est désormais possible de lire le corps, de conserver son contenu pour une utilisation ultérieure et de lier ses données à une structure avec succès.

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