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

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 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
  • ¥15 怎么把多于硬盘空间放到根目录下
  • ¥15 Matlab问题解答有两个问题
  • ¥15 LCD12864中文显示
  • ¥15 在使用CH341SER.EXE时不小心把所有驱动文件删除了怎么解决
  • ¥15 gsoap生成onvif框架