我正在使用TIdHTTP
组件及其GET
功能。
GET
函数发送完整的请求,没问题。
但是我想从GET响应中节省/保存一些流量,并且只想接收第一个"行中的响应码" HTTP响应。
是否有可能断开连接以节省来自任何其他内容的流量?
如上所述,我只需要网站的响应代码。
我考虑使用Indy的TCP组件(使用SSL IOHandler)并制作一个自己的HTTP请求标头,然后接收响应代码并断开连接 - 但我不知道该怎么做。
答案 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;
。这会立即关闭连接,下载不会继续,但您仍然拥有响应代码,内容长度等元数据。