为了账号安全,请及时绑定邮箱和手机立即绑定

golang request.ParseForm() 是否与“application/json

golang request.ParseForm() 是否与“application/json

Go
桃花长相依 2021-09-10 14:55:03
在 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:3000prints: map[foo:[bar]]对于此 curl 请求,处理程序不会打印表单值:curl -H "Content-Type: application/json" -d '{"foo":"bar"}' http://localhost:3000prints: map[]
查看完整描述

1 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

ParseForm 不解析 JSON 请求正文。第一个示例的输出出乎意料。


以下是解析 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

 }


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信