为了账号安全,请及时绑定邮箱和手机立即绑定

多次从 Reader 阅读

多次从 Reader 阅读

Go
慕森卡 2021-08-16 19:17:51
我正在构建一个简单的缓存代理,它拦截 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)


查看完整回答
反对 回复 2021-08-16
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

正如您所发现的,您只能从请求的正文中读取一次。

Go 有一个反向代理,可以方便您尝试执行的操作。查看httputil.ReverseProxy和httputil.DumpResponse


查看完整回答
反对 回复 2021-08-16
  • 3 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信