Go で AJAX タイプのアプリを作成する準備をしています。これは、それがどのように機能するかを理解するためのサンプル アプリです。しかし、そうではありません。InputRec (irec) フィールドは、デコード後にゼロになります。まずソース:
package main
import (
"net/http"
"encoding/json"
"fmt"
// "io/ioutil"
)
type InputRec struct {
a, b float64
}
type RetRec struct {
sum float64
}
func addHandler(w http.ResponseWriter, r *http.Request) {
var outJson []byte
var irec InputRec
var orec RetRec
/* inJson, err := ioutil.ReadAll(r.Body)
num := len(inJson)
if err != nil {
panic("Error on reading body")
}
r.Body.Close()
err = json.Unmarshal(inJson, &irec)
fmt.Println("Input ", num, " bytes: ", string(inJson)) */
decoder := json.NewDecoder(r.Body)
err := decoder.Decode(&irec)
if err != nil {
panic("Error on JSON decode")
}
orec.sum = irec.a + irec.b
fmt.Println("a: ", irec.a, " b: ", irec.b, " Sum: ", orec.sum)
outJson, err = json.Marshal(orec)
if err != nil {
panic("Error on JSON encode")
}
w.Header().Set("Content-Type", "application/json")
_, err = w.Write(outJson)
if err != nil {
panic("Error writing response")
}
}
func main() {
http.HandleFunc("/", addHandler)
http.ListenAndServe(":1234", nil)
}
今テスト:
curl -X POST -i -d '{"a":5.4,"b":8.7}' http://localhost:1234/
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 2
Date: Sun, 23 Jun 2013 17:01:08 GMT
{}
短いjson.Decoder行の代わりにコメントアウトされたコードで試してみたので、リクエストボディが関数に到達していることを知っていることに注意してください。リクエストボディは期待どおりに出力されました。
上記の curl 要求を行うと、これは Println コマンドからの出力として表示されます。
a: 0 b: 0 合計: 0
json フィールドが InputRec (a と b のみ) に並んでいることは明らかなようですが、ここで何が問題なのですか?
どうもありがとう!