2016-03-22 13 views
-2

JSONデータをjavascriptページからgolangサーバーにPOSTしようとしていますが、JSONデータのトレースを見つけることができません。 SOは両側で答えを受け入れた。GoLang/Javascript:JSON POSTで空のpostFormとdecode(body)

This postは私がJavascriptでJSONを投稿する方法を示しており、this postはGoでこのJSONを処理する方法を示しています。

//js json post send 
var request = new XMLHttpRequest(); 
request.open('POST', 'http://localhost:8080/aardvark/posts', true); 
request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8'); 

var data = {hat: "fez"}; 
request.send(JSON.stringify(data)); 

The header below was set from this answer

//Go json post response 
func reply(w http.ResponseWriter, r *http.Request) { 

    w.Header().Set("Access-Control-Allow-Origin", "*") 
    w.Header().Set("Access-Control-Allow-Credentials", "true") 
    w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With") 
    w.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT") 


    if err := r.ParseForm(); err != nil { 
     fmt.Println(err); 
    } 

    //this is my first impulse. It makes the most sense to me. 
    fmt.Println(r.PostForm);   //out -> `map[]` would be `map[string]string` I think 
    fmt.Println(r.PostForm["hat"]); //out -> `[]` would be `fez` or `["fez"]` 
    fmt.Println(r.Body);    //out -> `&{0xc82000e780 <nil> <nil> false true {0 0} false false false}` 


    type Hat struct { 
     hat string 
    } 

    //this is the way the linked SO post above said should work. I don't see how the r.Body could be decoded. 
    decoder := json.NewDecoder(r.Body) 
    var t Hat 
    err := decoder.Decode(&t) 
    if err != nil { 
     fmt.Println(err); 
    } 
    fmt.Println(t);     //out -> `{ }` 
} 

私はここから試して他に何を本当にわかりません。この仕事をするために私は何を変えるべきですか?

+1

あなたは 'r.Body'を使用しています。あなたがそれを印刷するときに奇妙に見える理由は、実際の内容ではなく、投稿された内容(つまり、io.Reader)を読むことができる構造を印刷しているからです。 – djd

+0

の方がはるかに意味があります。 –

+1

'ParseForm'はjson –

答えて

3

フィールドhatを構造体Hatにエクスポートすると、jsonのデコードが機能します。

type Hat struct { 
    Hat string // Exported field names begins with capital letters 
} 
+0

とは異なる' application/x-www-form-urlencoded'または 'multipart/form-data'であることを期待しているので正しく動作しませんでした。ありがとうございます –

+1

完全な詳細については、正確なマッチングを選択するだけでなく、大文字と小文字を区別しないマッチを受け入れるように[docs for Unmarshal](https://golang.org/pkg/encoding/json/#Unmarshal):構造体への非マーシャルのアンマーシャリングを参照してください。 Unmarshalは、構造体のエクスポートされたフィールドのみを設定します。 " – djd

+0

非マーシャルの代わりにJSON.decodeを使用する必要があります。彼らは非常に似ているように見えますが。 JSON.decodeは、非整列の基本関数の一種の拡張ですか? –