使用Indy的TIdHTTP
组件,我想执行POST
操作而不必等待服务器的响应。我使用的正常功能是:
IdHTTP1->Post(sURL, reqStream, resStream);
但是我想跳过响应以节省时间,因此Post()
退出得更快。我该怎么办?
答案 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