一尘不染

在golang中多次请求后多次关闭响应正文

go

在这篇文章中),指出了response.Body应该被关闭以避免资源泄漏。它也显示在http软件包godoc的概述示例中。

在测试代​​码中,我发送了多个请求以尝试使用

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)

在服务器端(即)内部的相关问题,func(w http.ResponseWriter, r *http.Request)是否也需要关闭请求主体?


阅读 204

收藏
2020-07-02

共1个答案

一尘不染

是的,您需要关闭两个回复。推迟一个呼叫resp.Body.Close不会以某种方式影响另一个。*http.Response每种情况下的都不同,并且两者都可以推迟。

在服务器端,您无需关闭文档中Request.Body-
http.Request

// The Server will close the request body. The ServeHTTP
// Handler does not need to.
2020-07-02