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
}
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
}
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> <div class="code" style="position:relative; padding:0px; margin:0px;"><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!