首页 > 解决方案 > 如果我不需要响应,是否需要 resp.Body.Close()?

问题描述

我正在提出不需要回应的请求。如果我这样做会导致任何问题吗?

client = &http.Client{
    Timeout: time.Duration(15 * time.Second),
}
...
...
_, err := client.Do(req)

标签: httpgo

解决方案


引用文档Client.Do()

如果返回的错误为 nil,则 Response 将包含一个非 nil Body,用户应该关闭它。如果 Body 没有被读取到 EOF 并关闭,则客户端的底层 RoundTripper(通常是 Transport)可能无法重新使用与服务器的持久 TCP 连接来进行后续的“保持活动”请求。

所以是的,如果没有错误,你总是必须关闭它。您还应该在关闭之前将正文阅读到 EOF。引自http.Response

// The default HTTP client's Transport may not
// reuse HTTP/1.x "keep-alive" TCP connections if the Body is
// not read to completion and closed.

如果你不需要身体,你可以像这样丢弃它:

resp, err := client.Do(req)
if err != nil {
    // handle error and return
    return
}
defer resp.Close()
io.Copy(ioutil.Discard, resp.Body)

如果有错误,请参阅相关问题:如果调用http.Get(url)发生错误,我们是否需要关闭响应对象?


推荐阅读