nos*_*nos 2 rest http response request go
在这篇文章中,指出应该关闭 response.Body 以避免资源泄漏。它也显示在http 包 godoc中的概述示例中。
在我的测试代码中,我发送了多个请求来尝试一个 API
resp, err := http.DefaultClient.Do(req)
在同一个函数中多次。这是一种不好的做法吗?在这种情况下,我是defer resp.Body.Close()
在每个人之后写,还是只写一次?
url := server.URL + "/ticket/add"
reader = strings.NewReader(`{"id": "test1", "detail": "test1"}`)
req, err := http.NewRequest("POST", url, reader)
assert.Nil(t, err)
resp, err := http.DefaultClient.Do(req)
assert.Nil(t, err)
defer resp.Body.Close()
assert.Equal(t, http.StatusCreated, resp.StatusCode)
// add a ticket with same id
reader = strings.NewReader(`{"id": "test1"}`)
req, err = http.NewRequest("POST", url, reader)
assert.Nil(t, err)
resp, err = http.DefaultClient.Do(req)
assert.Nil(t, err)
assert.Equal(t, http.StatusInternalServerError, resp.StatusCode)
Run Code Online (Sandbox Code Playgroud)
一个相关的问题,在服务器端,即在 内部func(w http.ResponseWriter, r *http.Request)
,是否也需要关闭请求正文?
是的,您需要关闭这两个响应。推迟一个调用resp.Body.Close
不会以某种方式影响另一个。该*http.Response
在每种情况下不同,它们都可以被推迟。
在服务器端,您不需要Request.Body
从http.Request
文档中关闭-- :
// The Server will close the request body. The ServeHTTP
// Handler does not need to.
Run Code Online (Sandbox Code Playgroud)