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时的事件AWorkMode是wmRead,这种紧密的连接越快......但等待"第一个字节"的回应.
有一种方法可以在不等待响应的情况下发送数据吗?
Rem*_*eau 11
简短的回答是NO,那么不是TIdHTTP,反正.HTTP是一种协议,TIdHTTP遵循协议,包括读取服务器的响应.
正如您所发现的那样,您可以在TIdHTTP.OnWork事件中引发异常,但只有在从服务器收到至少1个字节时才会生效.但是,您可以指定一个短TIdHTTP.ReadTimeout值来避免这种情况.
另一种选择是在TIdHTTP.OnHeadersAvailable事件中关闭套接字连接,但这需要TIdHTTP读取服务器的完整响应头.
如果响应使用HTTP 1.1分块,则可以hoNoReadChunked在TIdHTTP.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)