猿问

多次从 Reader 阅读

我正在构建一个简单的缓存代理,它拦截 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?


慕森卡
浏览 185回答 3
3回答

当年话下

在我的评论中,您可以实现 io.ReadCloser根据 Dewy Broto(谢谢),您可以通过以下方式更简单地做到这一点:content, _ := ioutil.ReadAll(response.Body)response.Body = ioutil.NopCloser(bytes.NewReader(content))response.Write(w)

繁华开满天机

正如您所发现的,您只能从请求的正文中读取一次。Go 有一个反向代理,可以方便您尝试执行的操作。查看httputil.ReverseProxy和httputil.DumpResponse
随时随地看视频慕课网APP

相关分类

Go
我要回答