TIdHTTP - 只获取响应码
TIdHTTP - Get only Responsecode
我正在使用 TIdHTTP
组件,它是 GET
函数。
GET
函数发送一个完整的请求,没问题。
但是我想 spare/save 来自 GET 响应的一些流量,并且只想接收 HTTP 响应的第一个 "line" 中的 Responsecode。
是否可以断开连接以节省任何其他内容的流量?
如前所述,我只需要来自网站的响应代码。
我也考虑过使用 Indy 的 TCP 组件(带有 SSL IOHandler)并制作一个自己的 HTTP 请求 Header 然后接收响应代码并在成功时断开连接 - 但我不知道该怎么做。
通常你会使用 TIdHttp.Head
,因为 HEAD 请求就是为了这样做。
如果服务器不像 OP 那样接受 HEAD 请求,您可以分配 TIdHttp
实例的 OnWorkBegin
事件,并在那里调用 TIdHttp(Sender).Disconnect;
。这会立即关闭连接,下载不会继续,但您仍然拥有响应代码、内容长度等元数据。
TIdHTTP
有一个 OnHeadersAvailable
事件专门用于此任务。它在读取响应 headers 之后和读取 body 内容(如果有)之前触发。它有一个 VContinue
输出参数,您可以将其设置为 False 以取消任何进一步的阅读。
更新:我刚刚发现的东西:在OnHeadersAvailable
事件中设置VContinue=False
时,TIdHTTP
将设置Response.KeepAlive=False
并跳过读取响应 body(到目前为止还可以),但是在响应完成处理后,TIdHTTP
检查 KeepAlive
值,并且 属性 getter returns 如果服务器端没有关闭套接字则为真(HTTP 1.1 默认使用 keep-alives)。这会导致 TIdHTTP
无法关闭套接字的末端,并且会留下任何未读响应 body。如果您然后 re-use 对新的 HTTP 请求使用相同的 TIdHTTP
object,它将在看到您的响应 headers 的新请求。
您可以通过在调用 TIdHTTP.Get()
之前将 Request.Connection
属性 设置为 'close'
来解决此问题。这告诉服务器在发送响应后关闭其套接字连接的末端(尽管我刚刚发现在请求 HTTPS url 时,尤其是在 HTTP 请求定向到 HTTPS 之后,TIdHTTP
清除 Request.Connection
价值!)。或者,在 TIdHTTP.Get()
退出后简单地调用 TIdHTTP.Disconnect()
。
我现在已经将 TIdHTTP
更新为:
准备 HTTPS 请求时不再清除 Request.Connection
。
关闭套接字连接的末端,如果:
OnHeadersAvailable
returns VContinue=False
Request.Connection
属性(或者,如果连接到代理,Request.ProxyConnection
属性)已设置为'close'
,不管服务器的响应如何。
我正在使用 TIdHTTP
组件,它是 GET
函数。
GET
函数发送一个完整的请求,没问题。
但是我想 spare/save 来自 GET 响应的一些流量,并且只想接收 HTTP 响应的第一个 "line" 中的 Responsecode。
是否可以断开连接以节省任何其他内容的流量?
如前所述,我只需要来自网站的响应代码。
我也考虑过使用 Indy 的 TCP 组件(带有 SSL IOHandler)并制作一个自己的 HTTP 请求 Header 然后接收响应代码并在成功时断开连接 - 但我不知道该怎么做。
通常你会使用 TIdHttp.Head
,因为 HEAD 请求就是为了这样做。
如果服务器不像 OP 那样接受 HEAD 请求,您可以分配 TIdHttp
实例的 OnWorkBegin
事件,并在那里调用 TIdHttp(Sender).Disconnect;
。这会立即关闭连接,下载不会继续,但您仍然拥有响应代码、内容长度等元数据。
TIdHTTP
有一个 OnHeadersAvailable
事件专门用于此任务。它在读取响应 headers 之后和读取 body 内容(如果有)之前触发。它有一个 VContinue
输出参数,您可以将其设置为 False 以取消任何进一步的阅读。
更新:我刚刚发现的东西:在OnHeadersAvailable
事件中设置VContinue=False
时,TIdHTTP
将设置Response.KeepAlive=False
并跳过读取响应 body(到目前为止还可以),但是在响应完成处理后,TIdHTTP
检查 KeepAlive
值,并且 属性 getter returns 如果服务器端没有关闭套接字则为真(HTTP 1.1 默认使用 keep-alives)。这会导致 TIdHTTP
无法关闭套接字的末端,并且会留下任何未读响应 body。如果您然后 re-use 对新的 HTTP 请求使用相同的 TIdHTTP
object,它将在看到您的响应 headers 的新请求。
您可以通过在调用 TIdHTTP.Get()
之前将 Request.Connection
属性 设置为 'close'
来解决此问题。这告诉服务器在发送响应后关闭其套接字连接的末端(尽管我刚刚发现在请求 HTTPS url 时,尤其是在 HTTP 请求定向到 HTTPS 之后,TIdHTTP
清除 Request.Connection
价值!)。或者,在 TIdHTTP.Get()
退出后简单地调用 TIdHTTP.Disconnect()
。
我现在已经将 TIdHTTP
更新为:
准备 HTTPS 请求时不再清除
Request.Connection
。关闭套接字连接的末端,如果:
OnHeadersAvailable
returnsVContinue=False
Request.Connection
属性(或者,如果连接到代理,Request.ProxyConnection
属性)已设置为'close'
,不管服务器的响应如何。