golang request.ParseForm()是否与“application / json”Content-Type一起使用

时间:2014-12-22 01:17:14

标签: go

在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[]

1 个答案:

答案 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
 }