我正准备在 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)所以这里有什么问题?
非常感谢!