2015-10-20 2 views
-1

J'utilise Postman pour publier la chaîne json sur localhost. La chaîne de JSON Iam passant Postman est:Demander Body is null dans Go lang (Facteur)

{ 
    “name”: "foo" 
} 

Cependant, lorsque je récupère les données dans ma fonction de test, le req.Body i obtenir quelque chose comme ceci: &{%!s(*io.LimitedReader=&{0xc0820142a0 0}) <nil> %!s(*bufio.Reader=<nil>) %!s(bool=false) %!s(bool=true) {%!s(int32=0) %!s(uint32=0)} %!s(bool=true) %!s(bool=false) %!s(bool=false)}

Je souhaite obtenir le nom: foo dans le corps de la requête.

Mon go Code lang pour le même est:

import (
    "encoding/json" 
    "fmt" 
    "net/http" 
) 

type Input struct { 
    Name string `json:"name"` 
} 


func test(rw http.ResponseWriter, req *http.Request) { 
    var t Input 
    json.NewDecoder(req.Body).Decode(&t) 
    fmt.Fprintf(rw, "%s\n", req.Body) 
} 

func main() { 
    http.HandleFunc("/test", test) 
    http.ListenAndServe(":8080", nil) 
} 

Quelqu'un peut-il me dire pourquoi je reçois des données vides dans l'attribut req.Body? Merci beaucoup.

+1

Vous devez imprimer 't' pas 'req.Body' Et ** s'il vous plaît **: gérer chaque erreur – Volker

+0

@Volker: J'ai essayé cela.Impression t me donne un' {} 'vide. ( –

+0

Comment avez-vous imprimé 't'? Comme' "% s", t.name' ou '"% # v ", t'. Une sortie de" {} "semble étrange et gère toutes les erreurs – Volker

Répondre

2

Reuqes Le corps devrait être vide parce que vous avez déjà tout lu. Mais ce n'est pas le problème.
De votre question, il semble votre entrée n'est pas JSON valide (vous avez « qui est différent avec ").
La méthode Decode renverra l'erreur, vous devez vérifier que.

if err := json.NewDecoder(req.Body).Decode(&t); err != nil { 
    fmt.Println(err) 
} 
+0

La méthode de décodage n'a renvoyé aucune erreur, mais a bien fonctionné avec le code que vous avez suggéré. Je me demande encore quel était le rôle de la variable err ici. N'importe quelles idées seraient appréciées. merci beaucoup :) –

+0

Pas une magie comme vous le pensez. Si aucune erreur ne renvoie (err == nil) alors le succès du décodage. Dans votre cas lorsque le 't' variale vide, il doit y avoir une erreur survenue! – nvcnvn