2016-07-05 107 views
0

我试图通过阅读http响应正文来避免浪费流量,只有当我看到正确的内容类型内容长度小于设定的阈值。获取来自请求的响应是否获得了所有的身体? (golang,net/http)

httpRequest, err := http.NewRequest("GET", url, nil) 
httpResponse, err := httpClient.Do(httpRequest) 
contentType := httpResponse.Header.Get("Content-Type") 

// ... check for correct contentType  

// Read body into memory? 
content, err := ioutil.ReadAll(httpResponse.Body) 

它是正确的假设,如果我做的GET请求,我将让所有的身体,无论我是否叫最后一行iotuil.ReadAll(httpResponse.Body)与否?

如果是这样,我可以想到避免浪费流量的唯一方法是使用HEAD请求,但如果我真的想要读取正文,我将不得不做另一个GET请求。如果我提出HEAD请求,还可以得到正确的content-length值吗?

什么是最好的策略?

回答

1

应用程序应该关闭响应主体,如果应用程序不想读取它。在Go的最新版本中,网/ http client will close the underlying network connection instead of slurping up the remainder of the response body from the network

可能未设置Content-Length标头。在这种情况下,应用程序应该读取阈值字节数或EOF。

在所有情况下,应用程序完成响应时关闭响应主体。

无法保证对HEAD请求的响应包含Content-Length标头。

+0

感谢您的快速回答。你是说net/http **不会发送TCP数据包**来读取body,直到** ioutil.ReadAll(httpResponse.Body)**被调用? – shicky

+0

如果客户端没有读取响应主体,则服务器将发送数据,直到TCP窗口填充或客户端关闭连接。关闭响应主体是减少通过网络传输的数据量的唯一选择。 –