http - 如何在不解析正文的情况下只获取状态码?

标签 http go httprequest httpresponse http-response-codes

<分区>

标题是说。 我只需要状态码。不是响应体。

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 客户端配置为对响应主体使用非常小的缓冲区,以尽量减少关闭主体之前使用的资源,但同样,可能无法保证这实际上会阻止响应主体被通过网络发送。

关于http - 如何在不解析正文的情况下只获取状态码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47887242/

相关文章:

php,自己的小文件管理器而不是 FTP。好主意?

C# 多个异步 HttpRequest 与一个回调

javascript - Chrome 扩展 : identify web requests of background-page iframe?

.NET HttpClient - 有条件地忽略证书错误

java - Android Retrofit GET 调用响应为 NULL

http - html 文件和加载的 DOM 内容之间有 400 毫秒的差距?

go - 在 golang 中使用发送网格?

go - 无法从HTTP Get方法获得响应

angularjs - 来自浏览器的 Ajax 不起作用,但来自 PostMan 的有效

java - HTTP 服务器 System.out 问题