2

Goを使用して、アプリケーションのJavascriptフロントエンドからAppEngineにJSON形式でリクエストを送信しようとしています。ハンドラーの構造体へのリクエストを解析するにはどうすればよいですか?

たとえば、私のリクエストがリクエストペイロードを含むPOSTであるとします。

{'Param1':'Value1'}

そして私の構造体は

type Message struct {
    Param1 string
  }                                    

と変数

var m Message                               

App Engineドキュメントの例では、標準のリクエスト値を取得するためにFormValue関数を使用していますが、jsonを使用する場合はこれが機能しないようです。

簡単な例をいただければ幸いです。

4

2 に答える 2

5

公式ドキュメントはかなり良いです、参照してください:

http://golang.org/doc/articles/json_and_go.html

既知の構造へのエンコード/デコードの両方の例(あなたの例)がありますが、よりスクリプト言語で通常行う方法と同様に、リフレクションを使用してそれを行う方法も示しています。

于 2013-01-19T20:56:15.297 に答える
1

フォームフィールドでデータを送信することもできますが、通常はから読み取るだけですresponse.Body。最小限のjQueryとAppEngineの例を次に示します。

package app

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "strings"
)

func init () {
    http.HandleFunc("/", home)
    http.HandleFunc("/target", target)
}

const homePage =
`<!DOCTYPE html>
<html>
<head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
</head>
<body>
    <form action="/target" id="postToGoHandler">
    <input type="submit" value="Post" />
    </form>
    <div id="result"></div>
<script>
$("#postToGoHandler").submit(function(event) {
    event.preventDefault();
    $.post("/target", JSON.stringify({"Param1": "Value1"}),
        function(data) {
            $("#result").empty().append(data);
        }
    );
});
</script>
</body>
</html>`

func home(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, homePage)
}

type Message struct {
    Param1 string
}

func target(w http.ResponseWriter, r *http.Request) {
    defer r.Body.Close()
    if body, err := ioutil.ReadAll(r.Body); err != nil {
        fmt.Fprintf(w, "Couldn't read request body: %s", err)
    } else {
        dec := json.NewDecoder(strings.NewReader(string(body)))
        var m Message
        if err := dec.Decode(&m); err != nil {
            fmt.Fprintf(w, "Couldn't decode JSON: %s", err)
        } else {
            fmt.Fprintf(w, "Value of Param1 is: %s", m.Param1)
        }
    }
}
于 2013-01-20T12:41:53.270 に答える