【发布时间】:2016-01-18 17:04:54
【问题描述】:
我正在使用 Go 通过 HTTPS 发出许多请求,但我遇到了不重用连接和端口不足的问题。我发出的请求是对返回 JSON 格式数据的 API 的请求,然后我将其 json.Decode 转换为 Go 值。
根据我在这个网站上遇到的问题(#1,#2),为了让 Go 将连接重用于另一个请求,我必须在关闭之前阅读整个响应正文(注意这个如here 所述,并非总是如此。
Previously the HTTP client's (*Response).Body.Close would try to keep
reading until EOF, hoping to reuse the keep-alive HTTP connection...
在典型情况下,我会使用前面链接中显示的示例,如下所示:
ioutil.ReadAll(resp.Body)
但由于我是通过如下代码从 JSON 中提取数据:
...
req, _ := http.NewRequest("GET", urlString, nil)
req.Header.Add("Connection", "keep-alive")
resp, err = client.Do(req)
defer resp.Body.Close()
...
decoder := json.NewDecoder(resp.Body)
decoder.Decode(data)
我不确定这两种方法会如何交互。
所以问题是,我如何确保已读取整个响应,以便稍后可以将连接重用于另一个请求?
【问题讨论】:
-
嗯。也许最简单的方法是自己实现旧行为:
defer func() { io.Copy(ioutil.Discard, resp.Body); resp.Body.Close() }(). -
也许在 decoder.Decode(data), 返回之后你已经读取了所有数据。
-
如果您只期望正文中有 1 个合理大小的 json 响应,请不要使用解码器。使用 ReadAll 和 json.Unmarshal。
-
我希望 JSON 的大小合理,但可能有许多并发/并行 goroutine,每个都处理响应。目前我使用的系统有足够的 RAM 来处理这个问题,但我不想依赖它。
标签: json http go request connection