标题是说。
我只需要状态码。不是响应体。
package main
import (
"fmt"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "http://api.example.com/getUserList", nil)
res, _ := http.DefaultClient.Do(req) // <-- 300KB Full page downloading here
fmt.Print("status code", res.StatusCode)
}
如何在获得状态码后中断响应流?
(或者有可能吗?)
谢谢
简短的回答是......这可能是不可能的。
一般来说,HTTP 客户端总是检索包含正文的任何响应的完整响应(状态、 header 、和正文),因为 HTTP 就是这样做的作品。请注意,“HEAD”方法专门执行您想要的操作,但由于您必须使用“POST”方法,因此显然不适用于此处。
正如评论者所提到的,在某种意义上,您可以通过不阅读响应主体(如您当前的示例所做的那样)来简单地忽略响应主体,但客户端系统仍会产生下载主体的网络成本 - 它不会浮出水面在您的应用程序中。
从理论上讲,您可以实现自定义 HTTP 客户端(或者可能配置现有客户端),以便它在检索到 HTTP 状态后立即尝试终止底层 TCP 连接并忽略 HTTP 响应的其余部分;但是,此策略可能非常复杂,并且会受到应用程序无法控制的大量因素的影响。
最终,您的示例代码可能是您所能做的最好的,它只关注状态代码而忽略响应正文。可能值得立即关闭响应读取器以向 HTTP 库指示不需要相关资源并可以立即释放;但是,不能保证它会产生任何效果。此外,您可以将 HTTP 客户端配置为对响应主体使用非常小的缓冲区,以尽量减少关闭主体之前使用的资源,但同样,可能无法保证这实际上会阻止响应主体被通过网络发送。