1

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

非常感谢!

4

1 回答 1

2

我知道了。我的结构的成员必须大写。:/

于 2013-06-23T18:10:29.497 回答