在Go(1.4)中使用简单的HTTP服务器,如果content-type设置为" application / json",请求表单为空。这是有意的吗?
简单的http处理程序:
func (s Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
log.Println(r.Form)
}
对于此curl请求,处理程序打印正确的表单值:
curl -d '{"foo":"bar"}' http://localhost:3000
prints: map[foo:[bar]]
对于此curl请求,处理程序不会打印表单值:
curl -H "Content-Type: application/json" -d '{"foo":"bar"}' http://localhost:3000
prints: map[]
答案 0 :(得分:7)
ParseForm不解析JSON请求主体。第一个示例的输出是unexpected。
以下是解析JSON请求体的方法:
func (s Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
var v interface{}
err := json.NewDecoder(r.Body).Decode(&v)
if err != nil {
// handle error
}
log.Println(v)
}
您可以定义一个类型以匹配JSON文档的结构并解码为该类型:
func (s Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
var v struct {
Foo string `json:"foo"`
}
err := json.NewDecoder(r.Body).Decode(&v)
if err != nil {
// handle error
}
log.Printf("%#v", v) // logs struct { Foo string "json:\"foo\"" }{Foo:"bar"} for your input
}