Maison > développement back-end > Golang > 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
Libérer: 2024-10-31 10:34:06
original
553 Les gens l'ont consulté

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>
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">return result, err
Copier après la connexion
Copier après la connexion

}
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>
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">return result, err
Copier après la connexion
Copier après la connexion

}
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
Copier après la connexion

}
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> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">bodyBytes, _ = ioutil.ReadAll(context.Request().Body)
Copier après la connexion

}

// 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!

source:php.cn
Article précédent:Comment exécuter des commandes avec des arguments entre guillemets doubles sous Windows à l'aide du package exec ? Article suivant:Pourquoi « go install » ignore-t-il mon paramètre « GOPATH » et s'installe-t-il sur « GOROOT » ?
Déclaration de ce site Web
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
Derniers articles par auteur
Derniers numéros
Rubriques connexes
Plus>
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal