为什么我的GoLang POST请求没有填充数据?

时间:2015-05-20 03:41:17

标签: go

func forwarderHandlerFunc(w http.ResponseWriter, r *http.Request) {
    client := &http.Client{}
    u, _ := url.Parse(r.RequestURI)
    req, _ := http.NewRequest(r.Method, fmt.Sprintf("%s%s", apiUrl, u.Path), r.Body)
    fmt.Printf(fmt.Sprintf("%s\n", nutils.ReaderToString(req.Body)))
    resp, _ := client.Do(req)
    resp.Write(w)
}

我正在尝试将传入的HTTP请求转发到另一个端点,同时将主体(包括POST / PUT表单数据)复制到新请求中。

然而,它似乎不起作用,即使Body似乎打印出正确的数据。

打印输出为:

  

电子邮件= MEH%!克(丢失)mail.com

我该如何解决?

编辑:添加了更多调试信息,这次打印出resp的输出

func forwarderHandlerFunc(w http.ResponseWriter, r *http.Request) {
    client := &http.Client{}
    u, _ := url.Parse(r.RequestURI)

    req, _ := http.NewRequest(r.Method, fmt.Sprintf("%s%s", apiUrl, u.Path), r.Body)
    fmt.Printf(fmt.Sprintf("%s\n", nutils.ReaderToString(req.Body)))

    resp, _ := client.Do(req)
    b,_ := ioutil.ReadAll(resp.Body)
    fmt.Printf(fmt.Sprintf("%s\n", nutils.BytesToString(b)))

    resp.Write(w)
}
$ go install && gom-proxy-forwarder run --listen localhost:5002 --api-url http://localhost:5001
email=meh2%!g(MISSING)mail.com
{
  "email": null
}

它不应该为空。它应该是meh@gmail.com

3 个答案:

答案 0 :(得分:2)

知道了。问题是我在Python的Flask服务器端点不支持Go的请求所坚持的分块编码。

当我手动指定像req.ContentLength = 25这样的ContentLength时,它有效。

获得的经验:可能并不总是你的Go代码成为问题。

答案 1 :(得分:0)

您可能想要设置请求内容类型

req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

参考http://golang.org/src/net/http/client.go?s=14234:14316#L450

答案 2 :(得分:0)

  1. 要修复打印输出,您需要更改此信息:

    fmt.Printf(fmt.Sprintf("%s\n", nutils.ReaderToString(req.Body)))
    

    进入这个:

    fmt.Printf("%s", fmt.Sprintf("%s\n", nutils.ReaderToString(req.Body)))
    

    或者这个:

    fmt.Println(fmt.Sprintf("%s\n", nutils.ReaderToString(req.Body)))
    
  2. 通过打印出您正在使用它的请求正文。使用TeeReader

    req, _ := http.NewRequest(r.Method, fmt.Sprintf("%s%s", apiUrl, u.Path), io.TeeReader(r.Body, os.Stdout))
    

    摆脱nutils.ReaderToString电话。您只能从Reader阅读一次(除非它也是Seeker,但在重新使用之前您仍然需要Seek