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
答案 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)
要修复打印输出,您需要更改此信息:
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)))
通过打印出您正在使用它的请求正文。使用TeeReader
:
req, _ := http.NewRequest(r.Method, fmt.Sprintf("%s%s", apiUrl, u.Path), io.TeeReader(r.Body, os.Stdout))
摆脱nutils.ReaderToString
电话。您只能从Reader
阅读一次(除非它也是Seeker
,但在重新使用之前您仍然需要Seek