我正在使用Go语言通过HTTPS进行多次请求,但是我遇到了不重用连接和端口耗尽的问题。我发起的请求是针对返回JSON格式数据的API,然后我使用json.Decode
将其转换为Go值。
根据我在本站上遇到的问题(#1,#2),为了使Go重用连接进行另一个请求,我必须在关闭之前读取响应体的全部内容(请注意,这并不总是这种行为,如此处所述)。
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() }()
。 - twotwotwo