英文:
how to make a copy of response of http.Get(url) request in Golang
问题
我正在尝试使用resp, err := http.Get(url)
命令将响应写入文件,并且同时使用相同的响应提取链接。
在使用resp.Write(f)
将内容写入文件后,我无法再使用resp.Body
来处理来自上述URL的响应,除非进行另一个http.Get
请求。
我尝试了resp2 := bytes.NewBuffer(resp)
,但是会出现类型不匹配的错误。我也尝试了复制操作。
英文:
I'm trying to use resp, err := http.Get(url)
command to write the response to file as well as use the same response to extract links.
After I write the content to a file using resp.Write(f)
, I cannot use resp.Body
for another purpose (for the response from the above url) without making another http.Get
request.
I tried resp2 := bytes.NewBuffer(resp)
. It gives eror as type does not match. I've tried copy as well.
答案1
得分: 5
假设响应适合内存,只需创建一个缓冲区并使用resp.Write,如下所示(未经测试,基本正确):
var b bytes.Buffer
if err := resp.Write(&b); err != nil {
// 处理错误
} else {
// 对缓冲区进行操作
}
对于适用于任何读取器的代码,请使用ioutil.ReadAll,它返回一个包含数据的新的[]byte,然后可以将其包装在bytes.Buffer中。
英文:
Assuming the response fits in memory, just create a buffer and use resp.Write, like (untested, basically correct):
var b bytes.Buffer
if err := resp.Write(b); err != nil {
// handle error
} else {
// Do something with buffer
}
for code that works with any reader, use: ioutil.ReadAll, which returns a new []byte containing the data that you can then wrap in a bytes.Buffer
答案2
得分: 3
httputil有一个响应转储功能。https://golang.org/pkg/net/http/httputil/#DumpRequest
它会用内存中的副本替换请求体,以便您可以重复使用它。
英文:
httputil has a response dump. https://golang.org/pkg/net/http/httputil/#DumpRequest
It will replace the body with an in-memory copy so you can reuse it.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论