英文:
Do I need to close Response body of http request even if I don't read it?
问题
我有以下代码:
resp, err := http.Head("http:something.com")
if err != nil {
//做一些处理
}
if resp.StatusCode == http.StatusOK {
//做一些处理
}
由于我没有读取resp
的body,我假设我不需要像resp.Body.Close()
那样关闭它。我的假设是正确的吗?还是我仍然应该调用resp.Body.Close()
?
英文:
I have the following code:
resp, err = http.Head("http:something.com")
if err != nil {
//do something
}
if resp.StatusCode == http.StatusOK {
// do something
}
As I am not reading the body of the resp
I am assuming that I don't need to close it like resp.Body.Close()
. Am I right in my assumption or should I still call resp.Body.Close()
?
答案1
得分: 6
http.Head()
是对 DefaultClient.Head()
的封装,它调用了 Client.Do()
,文档中说明:
> 如果返回的错误为nil,Response将包含一个非nil的Body,用户应该关闭它。如果没有将Body读取到EOF并关闭,Client的底层RoundTripper(通常是Transport)可能无法在后续的“keep-alive”请求中重用与服务器的持久TCP连接。
这应该足够让你关闭它。
即使你使用的是HTTP HEAD方法,这只是对服务器的一种“建议”。一个不符合RFC的服务器可能会返回一个body,即使不应该返回(对于HEAD请求),而Go的net/http
库可能会通过Response.Body
提供该body。所以你应该关闭它。即使没有发送或呈现给你任何body,关闭它也不会造成任何损害。
英文:
http.Head()
is a wrapper around DefaultClient.Head()
which issues Client.Do()
which documents that:
> If the returned error is nil, the Response will contain a non-nil Body which the user is expected to close. If the Body is not both read to EOF and closed, the Client's underlying RoundTripper (typically Transport) may not be able to re-use a persistent TCP connection to the server for a subsequent "keep-alive" request.
This should be enough for you to close it.
Even though you're using HTTP HEAD method, this is just more of a "recommendation" to the server. A server that does not conform to RFC may return a body even if it shouldn't (for a HEAD request), and Go's net/http
library may provide that body via Response.Body
. So you should close it. Even if no body is sent or presented to you, closing it will do no harm.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论