我有一个函数只是发出一个get请求来检查状态代码。它不会从身体上读取任何东西。我是否仍应使用resp.Body.Close()
结束此功能?
调用者在完成阅读后应该关闭resp.Body。如果resp.Body未关闭,则客户端的基础RoundTripper(通常为Transport)可能无法重新使用到服务器的持久TCP连接以用于后续“保持活动”请求。
答案 0 :(得分:21)
是。当您调用http.Get时,只要读取了所有HTTP标头,该函数就会返回响应。尚未阅读回复的正文。 Response.Body是与服务器的网络连接的包装器。当您从中读取时,它会下载响应的正文。
.Close()告诉系统您已完成网络连接。如果您尚未读取响应正文,则默认的http传输将关闭连接。 (如果正在读取正文,则传输只能重新使用连接,因为如果它重用与未读主体的连接,则使用该连接发出的下一个请求将收到先前请求的响应!)
因此,如果你要发出多个请求,那么阅读Body通常更有效而不仅仅是Close()> - 特别是对于创建起来相对昂贵的TLS连接。
如果您不需要响应的正文,则应使用Head而不是Get。 Head不需要阅读或关闭响应主体。