我正在构建一个简单的缓存代理,它拦截 HTTP 请求,抓取 response.Body 中的内容,然后将其写回客户端。问题是,一旦我从 response.Body 读取,写回客户端的内容包含一个空的正文(其他所有内容,如标题,都按预期写入)。这是当前的代码:func requestHandler(w http.ResponseWriter, r *http.Request) { client := &http.Client{} r.RequestURI = "" response, err := client.Do(r) defer response.Body.Close() if err != nil { log.Fatal(err) } content, _ := ioutil.ReadAll(response.Body) cachePage(response.Request.URL.String(), content) response.Write(w)}如果我删除content, _和cachePage线,它工作正常。包含行后,请求返回和空正文。任何想法,我怎么能得到公正的Body的http.Response,仍然完整地写出的响应http.ResponseWriter?
3 回答
当年话下
TA贡献1890条经验 获得超9个赞
在我的评论中,您可以实现 io.ReadCloser
根据 Dewy Broto(谢谢),您可以通过以下方式更简单地做到这一点:
content, _ := ioutil.ReadAll(response.Body)
response.Body = ioutil.NopCloser(bytes.NewReader(content))
response.Write(w)
繁华开满天机
TA贡献1816条经验 获得超4个赞
正如您所发现的,您只能从请求的正文中读取一次。
Go 有一个反向代理,可以方便您尝试执行的操作。查看httputil.ReverseProxy和httputil.DumpResponse
- 3 回答
- 0 关注
- 184 浏览
添加回答
举报
0/150
提交
取消