TIdHTTP - 仅获取响应码

时间:2017-02-26 09:35:55

标签: delphi indy delphi-10.1-berlin

我正在使用TIdHTTP组件及其GET功能。

GET函数发送完整的请求,没问题。

但是我想从GET响应中节省/保存一些流量,并且只想接收第一个"行中的响应码" HTTP响应。

是否有可能断开连接以节省来自任何其他内容的流量?

如上所述,我只需要网站的响应代码。

我考虑使用Indy的TCP组件(使用SSL IOHandler)并制作一个自己的HTTP请求标头,然后接收响应代码并断开连接 - 但我不知道该怎么做。

2 个答案:

答案 0 :(得分:3)

TIdHTTP有一个OnHeadersAvailable事件,专门用于此任务。在读取响应头之后以及读取正文内容(如果有)之前触发它。它有一个VContinue输出参数,你可以设置为False来取消任何进一步的读数。

更新:我刚发现的事情:在VContinue=False事件中设置OnHeadersAvailable时,TIdHTTP会设置Response.KeepAlive=False并跳过阅读回复body(OK到目前为止),但在响应完成后,TIdHTTP检查KeepAlive值,如果套接字未在服务器上关闭,则属性getter返回True&# 39; s end(HTTP 1.1默认使用keep-alives)。这会导致TIdHTTP不关闭套接字的结尾,并且会使任何响应正文保持未读状态。如果您为新的HTTP请求重新使用相同的TIdHTTP对象,它将在看到新请求的响应标头之前,最终处理上一个响应中的任何未读正文数据。

您可以在致电Request.Connection之前将'close'属性设置为TIdHTTP.Get()来解决此问题。这告诉服务器在发送响应后关闭套接字连接的结束(虽然,我发现在请求HTTPS网址时,特别是在HTTP请求指向HTTPS之后,TIdHTTP会清除Request.Connection值!)。或者,只需在TIdHTTP.Disconnect()退出后致电TIdHTTP.Get()

我现在已将TIdHTTP更新为:

  • 在准备HTTPS请求时不再清除Request.Connection

  • 如果是:

    ,请关闭套接字连接的结尾
    • OnHeadersAvailable返回VContinue=False

    • Request.Connection属性(或者,如果连接到代理,Request.ProxyConnection属性)已设置为'close',无论服务器的响应如何。

答案 1 :(得分:2)

通常你会使用TIdHttp.Head,因为HEAD请求只是为了这样做。

如果服务器不接受OP案例中的HEAD请求,您可以分配OnWorkBegin实例的TIdHttp事件,并在那里调用TIdHttp(Sender).Disconnect;。这会立即关闭连接,下载不会继续,但您仍然拥有响应代码,内容长度等元数据。