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 に答える