gpt4 book ai didi

go - resp.Body 的内容存储在哪里?

转载 作者:行者123 更新时间:2023-12-01 22:36:34 24 4
gpt4 key购买 nike

关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

2年前关闭。




Improve this question




我今天做了一个简单的 url 检索器。

1 resp, _ := http.Get("http://www.yahoo.com")
2 text, _ := ioutil.ReadAll(resp.Body)
3 resp.Body.Close()
4 fmt.Printf("%s", text)

结果按预期打印出来。但是,我不明白它为什么起作用。

我对第 2 行的理解 ioutil.ReadAll(resp.Body)返回 []bytes 提供给 'text' 变量。

但:
  • resp 是一个 *http.Response 结构
  • resp.Body 是一个 io.ReadCloser 接口(interface)
  • io.ReadCloser 实现 io.Reader 和 io.Closer 接口(interface)
  • io.Reader 签名为 (p []byte) (n int, err error)

  • 那么,这些 resp.Body 的内容存储在哪里? (与我目前接受 Body 的内容“神奇地”来自某个地方相反)

    最佳答案

    正如@Eklayvya 在评论中提到的,响应正文是按需流式传输的。但是要添加更多上下文。当您调用 http.Get() . Get() http/client 中的函数包初始化 http.DefaultClient代表您使用默认 HTTP header 和元数据创建请求。

    实际上,查看源代码会发现 Get只是更常见的 http.NewRequest() 的包装创建一个新的 HTTP 请求的函数。该请求由对 http.Do(req *Request) 的基础调用创建。它接收请求,执行额外的格式化,然后将请求发送到有问题的服务器。

    更多详情,有func send(ireq *Request, rt RoundTripper, deadline time.Time)http/client.go实际执行 http 请求的文件。如果您从函数签名中注意到,它使用您的请求,以及称为 RoundTripper 的第二个参数。 .这是事情变得更有趣的地方。

    // https://golang.org/src/net/http/client.go (line 117)
    // RoundTripper is an interface representing the ability to execute a
    // single HTTP transaction, obtaining the Response for a given Request.
    //
    // A RoundTripper must be safe for concurrent use by multiple
    // goroutines.
    type RoundTripper interface {
    ...
    RoundTrip(*Request) (*Response, error)
    }
    RoundTrip接受 Request并返回 Response包含 body 。这里是网络流式传输 response.Body 的字节的位置。因此您有能力接收 []byte从网络。 RoundTripper的执行接口(interface)由调用者的要求决定。在这种情况下,它是 http.DefaultClient .但是,您可以覆盖它并使用它做您想做的事情。

    一些网络库确实实现了这个接口(interface)。一个例子是 ClientConn结构来自 golang.org/x/net/http2包裹。第 970 行包含 RoundTrip 的实现。将正文写入其中。实现非常复杂,因为它满足并发性,以及超时和其他网络考虑。有兴趣的可以看看。

    这里是 blob

    关于go - resp.Body 的内容存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61556342/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com