如何在不解析 body 的情况下仅获取状态代码?

How can I get only status code without parsing the body?

标题是说。 我只需要状态码。没有回应 body.

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 客户端 总是 检索完整的响应(状态,headers, body) 对于包含 body 的任何响应,因为这正是 HTTP 的工作方式。请注意,"HEAD" 方法专门执行您想要的操作,但由于您必须使用 "POST" 方法,因此显然不适用于此处。

正如评论者所提到的,在某种意义上,您可以通过不阅读响应 body 来忽略它(就像您当前的示例所做的那样),但客户端系统仍会产生下载 body - 它不会出现在您的应用程序中。

从理论上讲,您可以实现自定义 HTTP 客户端(或者可能配置现有客户端),以便它在检索到 HTTP 状态后立即尝试终止底层 TCP 连接并忽略 HTTP 响应的其余部分;但是,此策略可能非常复杂,并且会受到应用程序无法控制的大量因素的影响。

最终,您的示例代码可能是您所能做的最好的,它只关注状态代码而忽略响应 body。可能值得立即关闭响应 reader 以向 HTTP 库表明不需要相关资源并可以立即释放;但是,不能保证它会产生任何效果。此外,您可以将 HTTP 客户端配置为对响应 body 使用非常小的缓冲区,以尝试在关闭 body 之前尽量减少使用的资源,但同样,可能无法保证这样做实际上会阻止响应 body 通过网络发送。