Delphi发送HTTP GET请求而无需等待服务器响应

ar0*_*968 3 delphi indy idhttp

我想发送HTTP请求(GET)而不等待服务器响应.

IdHTTP通过忽略响应尝试了,例如:

aIdHTTP := TIdHTTP.create;
try
  aIdHTTP.Get('https://stackoverflow.com/');
finally
  aIdHTTP.free;
free
Run Code Online (Sandbox Code Playgroud)

但它总是等待服务器响应......

一个小窍门是附近在引发异常的连接TIdHTTP.OnWork时的事件AWorkModewmRead,这种紧密的连接越快......但等待"第一个字节"的回应.

有一种方法可以在不等待响应的情况下发送数据吗?

Rem*_*eau 11

简短的回答是NO,那么不是TIdHTTP,反正.HTTP是一种协议,TIdHTTP遵循协议,包括读取服务器的响应.

正如您所发现的那样,您可以TIdHTTP.OnWork事件中引发异常,但只有在从服务器收到至少1个字节时才会生效.但是,您可以指定一个短TIdHTTP.ReadTimeout值来避免这种情况.

另一种选择是在TIdHTTP.OnHeadersAvailable事件中关闭套接字连接,但这需要TIdHTTP读取服务器的完整响应头.

如果响应使用HTTP 1.1分块,则可以hoNoReadChunkedTIdHTTP.HTTPOptions属性中启用该标志.但这也需要读取服务器的完整响应头.

真的,完成你要求的唯一方法就是不要使用它TIdHTTP.TIdTCPClient改为使用,并手动发送您自己的HTTP请求,然后在发送后关闭连接,例如:

aIdClient := TIdTCPClient.Create;
try
  aIdClient.Host := 'stackoverflow.com';
  aIdClient.Port := 443;

  aIdClient.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(aIdClient);
  TIdSSLIOHandlerSocketOpenSSL(aIdClient.IOHandler).PassThrough := False;

  aIdClient.Connect;
  try
    aIdClient.IOHandler.WriteLn('GET / HTTP/1.1');
    aIdClient.IOHandler.WriteLn('Host: stackoverflow.com');
    aIdClient.IOHandler.WriteLn('Connection: close');
    aIdClient.IOHandler.WriteLn;
  finally
    aIdClient.Disconnect;
  end;
finally
  aIdClient.free;
end;
Run Code Online (Sandbox Code Playgroud)

但是请求文件而不是实际下载它有什么意义呢?

如果您只想检查服务器是否可以连接,则根本不需要发送任何内容

aIdClient := TIdTCPClient.Create;
try
  aIdClient.Host := 'stackoverflow.com';
  aIdClient.Port := 443;
  aIdClient.Connect;
  aIdClient.Disconnect;
finally
  aIdClient.free;
end;
Run Code Online (Sandbox Code Playgroud)

如果您只是试图避免通过HTTP下载文件的实际内容,则可以使用TIdHTTP.Head()而不是TIdHTTP.Get():

aIdHTTP.Head('https://stackoverflow.com/');
Run Code Online (Sandbox Code Playgroud)