我正在尝试使用Go将JSON格式的请求从我的应用程序的Javascript前端发送到App Engine。如何将请求解析为处理程序中的结构?
例如,假设我的请求是带有请求有效负载的POST
{'Param1':'Value1'}
我的结构是
type Message struct {
Param1 string
}
和变量
var m Message
app引擎文档中的示例使用FormValue函数来获取标准请求值,这在使用json时似乎不起作用。
非常感谢一个简单的例子。
答案 0 :(得分:5)
官方文档非常好,请参阅:
http://golang.org/doc/articles/json_and_go.html
它既包含编码/解码到已知结构的示例(您的示例),也显示了如何使用反射执行此操作,类似于您通常在更多脚本语言中执行此操作。
答案 1 :(得分:1)
您可以在表单字段中发送数据,但通常只需从response.Body
中读取即可。这是一个最小的jQuery& App Engine示例:
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)
}
}
}