使用Indy 10中TIdHTTP的例子:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
uses
IdHttp;
.
.
.
function HttpGet( const Url: string ; var Html: string ): Boolean;
var
HttpClient: TIdHTTP;
begin
Result : = False;
HttpClient : = TIdHTTP.Create( nil );
try
Html : = HttpClient.Get(Url);
Result : = True;
except
on e: Exception do
begin
end ;
end ;
HttpClient.Free;
end ;
IdHttp;
.
.
.
function HttpGet( const Url: string ; var Html: string ): Boolean;
var
HttpClient: TIdHTTP;
begin
Result : = False;
HttpClient : = TIdHTTP.Create( nil );
try
Html : = HttpClient.Get(Url);
Result : = True;
except
on e: Exception do
begin
end ;
end ;
HttpClient.Free;
end ;
Indy采用的是同步I/O的方式,而且在连接超时控制方面存在bug,因此TIdHttp.Get()有时会发生陷入死锁无法返回的问题。
使用ICS中THttpCli的例子:
代码
uses
HttpProt;
.
.
.
function HttpGet( const Url: string ; var Html: string ): Boolean;
var
HttpClient: THttpCli;
DataLen: Int64;
FailMsg: string ;
begin
Result : = False;
HttpClient : = THttpCli.Create( nil );
HttpClient.URL : = Url;
HttpClient.NoCache : = True;
HttpClient.RcvdStream : = TMemoryStream.Create;
try
try
HttpClient.Get;
DataLen : = HttpClient.RcvdStream.Size;
SetLength(Html, DataLen);
HttpClient.RcvdStream.Position : = 0 ;
HttpClient.RcvdStream.Read(PChar(Html)^, DataLen);
Result : = True;
except
on E: EHttpException do
begin
FailMsg : = Format( ' Failed : %d %s ' ,
[HttpClient.StatusCode, HttpClient.ReasonPhrase]);
end else
raise ;
end ;
finally
HttpClient.RcvdStream.Free;
HttpClient.RcvdStream : = nil ;
HttpClient.Free;
end ;
end ;
HttpProt;
.
.
.
function HttpGet( const Url: string ; var Html: string ): Boolean;
var
HttpClient: THttpCli;
DataLen: Int64;
FailMsg: string ;
begin
Result : = False;
HttpClient : = THttpCli.Create( nil );
HttpClient.URL : = Url;
HttpClient.NoCache : = True;
HttpClient.RcvdStream : = TMemoryStream.Create;
try
try
HttpClient.Get;
DataLen : = HttpClient.RcvdStream.Size;
SetLength(Html, DataLen);
HttpClient.RcvdStream.Position : = 0 ;
HttpClient.RcvdStream.Read(PChar(Html)^, DataLen);
Result : = True;
except
on E: EHttpException do
begin
FailMsg : = Format( ' Failed : %d %s ' ,
[HttpClient.StatusCode, HttpClient.ReasonPhrase]);
end else
raise ;
end ;
finally
HttpClient.RcvdStream.Free;
HttpClient.RcvdStream : = nil ;
HttpClient.Free;
end ;
end ;
ICS使用的是异步I/O,其TFtpClient组件有Timout属性可以对连接超时进行控制,而THttpCli组件没有。但可以采用在定时器中调用THttpCli.Abort()取消连接的方式控制超时,也可以显式调用异步方法:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
var
HttpClient: THttpCli;
DataLen: Int64;
FailMsg: string ;
Tick: Cardinal;
begin
.
.
.
Tick : = GetTickCount;
try
try
HttpClient.GetASync;
while HttpClient.State <> httpReady do
begin
if GetTickCount - Tick > 30 * 1000 then
begin
HttpClient.Abort;
Exit;
end ;
Application.ProcessMessages;
end ;
.
.
.
HttpClient: THttpCli;
DataLen: Int64;
FailMsg: string ;
Tick: Cardinal;
begin
.
.
.
Tick : = GetTickCount;
try
try
HttpClient.GetASync;
while HttpClient.State <> httpReady do
begin
if GetTickCount - Tick > 30 * 1000 then
begin
HttpClient.Abort;
Exit;
end ;
Application.ProcessMessages;
end ;
.
.
.