http - r.PostForm 和 r.Form 总是空的

标签 http go

我有一个非常奇怪的问题,我要么真的瞎了,要么这是某种错误。我有以下 http.Handler:

func ServeHTTP(w http.ResponseWriter, r *http.Request) {
    err := r.ParseForm()
    if err != nil {
        log.Println("Error while parsing form data")
        return
    }
    log.Println("Printing r.PostForm:")
    for key, values := range r.PostForm { // range over map
        for _, value := range values { // range over []string
            log.Println(key, value)
        }
    }
    b, _ := ioutil.ReadAll(r.Body)
    s := string(b)
    log.Println("Printing body: ",s)
}

现在,当使用以下 FORM-Data 向绑定(bind)到此处理程序的 url 发送 PUT 请求时:

Name=someName
Version=1.0.0
PLanguage=java
GitRepo=someRepo

这始终是输出:

Printing r.PostForm:
Printing body: Name=someName&Version=1.0.0&PLanguage=java&GitRepo=someRepo

我已经尝试查找原因大约 2 个小时了,我只是不知道这里到底出了什么问题。解析 Form-Data 没有错误,但 r.PostForm 映射始终为空(我也尝试了 r.Form,结果相同)。因此,为了调试,我添加了打印正文的部分,只是为了确保其中确实有一些数据——而且确实如此。我真的很感激这里的任何帮助。提前致谢!

最佳答案

您需要设置“Content-Type” header 。

如果没有设置 header ,则根据 RFC 2616 使用“application/octet-stream”。

长话短说,这是一种二进制格式,因此您的正文不会被解析为 Form

关于http - r.PostForm 和 r.Form 总是空的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42012874/

相关文章:

php - 使用自己的上下文资源的 Coral CDN 的 file_get_contents 将不起作用

http - Meteor.js - 我可以对我的 Meteor 应用程序执行 HTTP POST 吗?

Python 请求得到响应 [200] 但表单未填写

Golang 严格的 nil 检查

http - Evernote 是否使用 HTTP 调用其 API?

javascript - Nodejs Http Server api 执行流程请解释一下?

go - Freeipa Ldap 与 GO 集成

regex - 查找与正则表达式golang匹配的所有字符串

go - Ginkgo 不在 Travis CI 中提供覆盖

json - 在 Go 中的嵌入式结构中组合任意 JSON 对象