在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
使用Indy 10中TIdHTTP的例子:
代码
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; 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; ICS使用的是异步I/O,其TFtpClient组件有Timout属性可以对连接超时进行控制,而THttpCli组件没有。但可以采用在定时器中调用THttpCli.Abort()取消连接的方式控制超时,也可以显式调用异步方法:
var HttpClient: THttpCli;
DataLen: Int64 ;
FailMsg: string ;
Tick: Cardinal ;
begin Result := False ;
HttpClient := THttpCli . Create( nil );
HttpClient . URL := Url;
HttpClient . NoCache := True ;
HttpClient . RcvdStream := TMemoryStream . Create;
Tick := GetTickCount;
try
try
HttpClient . GetASync;
while HttpClient . State <> httpReady do //检测HTTP状态
begin
if GetTickCount - Tick > 30 * 1000 then //此处设置了30S超时,可根据需要修改此数值
begin
HttpClient . Abort;
Exit;
end ;
Application . ProcessMessages;
end ;
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 使用Indy 10中TIdHTTP的例子:
代码
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; 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; ICS使用的是异步I/O,其TFtpClient组件有Timout属性可以对连接超时进行控制,而THttpCli组件没有。但可以采用在定时器中调用THttpCli.Abort()取消连接的方式控制超时,也可以显式调用异步方法:
var HttpClient: THttpCli;
DataLen: Int64 ;
FailMsg: string ;
Tick: Cardinal ;
begin Result := False ;
HttpClient := THttpCli . Create( nil );
HttpClient . URL := Url;
HttpClient . NoCache := True ;
HttpClient . RcvdStream := TMemoryStream . Create;
Tick := GetTickCount;
try
try
HttpClient . GetASync;
while HttpClient . State <> httpReady do //检测HTTP状态
begin
if GetTickCount - Tick > 30 * 1000 then //此处设置了30S超时,可根据需要修改此数值
begin
HttpClient . Abort;
Exit;
end ;
Application . ProcessMessages;
end ;
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 http://www.cnblogs.com/ddgg/archive/2010/08/25/1808058.html |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论