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',不管服务器的响应如何。