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

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),是否也需要关闭请求正文?

Jim*_*imB 5

是的,您需要关闭这两个响应。推迟一个调用resp.Body.Close不会以某种方式影响另一个。该*http.Response在每种情况下不同,它们都可以被推迟。

在服务器端,您不需要Request.Bodyhttp.Request文档中关闭-- :

// The Server will close the request body. The ServeHTTP
// Handler does not need to.
Run Code Online (Sandbox Code Playgroud)