HTTP发布,无需等待响应

时间:2018-08-30 20:22:42

标签: c++ c++builder indy idhttp

使用Indy的TIdHTTP组件,我想执行POST操作而不必等待服务器的响应。我使用的正常功能是:

IdHTTP1->Post(sURL, reqStream, resStream);

但是我想跳过响应以节省时间,因此Post()退出得更快。我该怎么办?

1 个答案:

答案 0 :(得分:4)

HTTP是请求/ 响应协议。 TIdHTTP旨在遵循该协议,这意味着其请求方法始终在退出前完整读取响应。

话虽如此,您有两种选择来完成自己想要的事情:

  • TIdHTTP正常读取响应,但根本不将其保存在任何地方。您可以使用响应TStream来丢弃写入其中的所有字节(例如没有事件TIdEventStream的{​​{1}}),或者使用的是Indy的最新版本,您只需将响应流设置为OnWrite

    NULL

    显然,这仍然至少需要从套接字读取完整响应的开销。

  • 使用IdHTTP1->Post(sURL, reqStream, (TStream*)NULL); 事件检查当前的TIdHTTP::OnHeadersAvailable状态代码。收到最终(非重定向,未授权)状态码时,通过引发异常(例如,通过调用Response)来中止响应的处理,这将绕过读取响应主体的过程。如果Sysutils::Abort()不能自动为您完成操作,请确保在退出TIdHTTP::Post()之后关闭基础套接字。或者,您可以关闭套接字而不是抛出自己的异常,并且当TIdHTTP无法从套接字读取响应正文时,让它抛出自己的异常。两种方法的最终效果都是相同的。

我已为您向Indy的问题跟踪器添加了一个新功能请求,以在将来的Indy版本中更好地解决这种情况:

#230 Add hoNoReadResponseBody flag to TIdHTTP.HTTPOptions property