dongwang788787 2014-12-22 01:17
浏览 1999
已采纳

golang request.ParseForm()是否与“ application / json”内容类型一起使用

Using a simple HTTP server in Go (1.4), the request form is empty if content-type is set to "application/json". Is this intended?

The simple http handler:

func (s Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    log.Println(r.Form)
}

For this curl request, the handler prints the correct form values:

curl -d '{"foo":"bar"}' http://localhost:3000
prints: map[foo:[bar]]

For this curl request, the handler does not print the form values:

curl -H "Content-Type: application/json" -d '{"foo":"bar"}' http://localhost:3000
prints: map[]
  • 写回答

1条回答 默认 最新

  • douwen1549 2014-12-22 02:30
    关注

    ParseForm does not parse JSON request bodies. The output from the first example is unexpected.

    Here's how to parse a JSON request body:

     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)
     }
    

    You can define a type to match the structure of your JSON document and decode to that type:

     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
     }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟