【问题标题】:How can I get only status code without parsing the body? [closed]如何在不解析正文的情况下仅获取状态代码? [关闭]
【发布时间】:2018-06-01 21:42:22
【问题描述】:

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

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)
}

获得状态码后如何中断响应流? (或者有可能?)

谢谢

【问题讨论】:

  • 这就是 HEAD 的用途。
  • @Volker 我感觉 OP 正在使用 RESTful 网络服务,它使用 POST 创建资源并在成功时返回状态码 201,所以在这种情况下,我可以想象他为什么想要忽略响应正文。
  • @Volker 但我需要像这样在服务器上执行 POST 请求。我不能使用 HEAD 或其他方法。
  • @ErkanErdem 在您从 res.Body 明确读取之前,响应正文不会“下载”,因此您只需关闭流即可。
  • 您确定需要POST 方法吗?此方法的目的是发送数据到服务器或执行一些动作

标签: http go httprequest httpresponse http-response-codes


【解决方案1】:

简短的回答是......这可能是不可能的。

一般来说,HTTP 客户端将总是检索包含正文的任何​​响应的完整响应(状态、标头、正文),因为这正是 HTTP 的方式作品。请注意,“HEAD”方法专门执行您想要的操作,但由于您必须使用“POST”方法,它显然不适用于此处。

正如评论者所提到的,从某种意义上说,您可以通过不阅读响应正文来简单地忽略它(就像您当前的示例所做的那样),但是客户端系统仍然会产生下载正文的网络成本 - 它只是不会浮出水面在您的应用程序中。

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

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

【讨论】:

  • 我不确定我是否理解第二段。除非您实际阅读,否则客户端不会下载整个正文(减去被拉入相对较小缓冲区的内容)。如果您关闭正文而不读取它,传输将关闭并丢弃连接,如果服务器继续发送,最终会导致 RST。
猜你喜欢
  • 1970-01-01
  • 2019-01-11
  • 2021-03-07
  • 1970-01-01
  • 2012-08-21
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
相关资源
最近更新 更多