因项目需要进行http的post提交数据,开始时用indy的idHttp组件,但是测试时发现当网络中断(如拔掉网线),idHttp的超时设置无效果,要等20秒才提示超时(参考网上的做法,将indy9升级到indy10,且设置了idHttp的connetTimeout,ReadTimeout属性,均无效果)。
后来发现用ICS组件THttpCli可以很好的控制提交超时,达到我的目的。
ICS版本:OverbyteIcsV7Gold
下载:http://www.overbyte.be/arch/OverbyteIcsV7Gold.zip
Delphi7安装ICS
1、下载完成后解压到英文目录,建议解压缩到Delphi7安装目录,如:C:\Program Files\Borland\OverbyteIcsV7Gold
2、Tools——Environment Options——library,在library path里加入OverbyteIcsV7Gold->Delphi->Vc32目录。
3、从File->Open中打开OverbyteIcsV7Gold->Delphi->Vc32->OverbyteIcsD7Design.dpk文件,compile——install。
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OverbyteIcsWndControl, OverbyteIcsHttpProt, StdCtrls;type TForm1 = class(TForm) HttpCli1: THttpCli; Button1: TButton; Memo1: TMemo; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure HttpCli1RequestDone(Sender: TObject; RqType: THttpRequest; ErrCode: Word); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var Data : String; retStr: string; DataLen: Int64; FailMsg: string;begin Data := '{' + '"machineCode":"123",' + '"orgCode":"123",' + '"data": {' + '"cardNo": "12345678",' + '"cardType": "2"' + '}' + '}'; HttpCli1.SendStream := TMemoryStream.Create; HttpCli1.RcvdStream := TMemoryStream.Create; try HttpCli1.SendStream.Write(Data[1], Length(Data)); HttpCli1.SendStream.Seek(0, 0); HttpCli1.URL := Trim(Edit1.Text); HttpCli1.Timeout := 2;//V7.04 sync only! try HttpCli1.ContentTypePost := 'application/json;charset=utf-8'; HttpCli1.Post; DataLen := HttpCli1.RcvdStream.Size; SetLength(retStr,DateDelta); HttpCli1.RcvdStream.Position := 0; HttpCli1.RcvdStream.Read(PChar(retStr)^,DataLen); Memo1.Text := retStr; //ShowMessage(retStr); except on E: Exception do begin ShowMessage(e.Message); end; end; finally HttpCli1.RcvdStream.Free; HttpCli1.RcvdStream := nil; HttpCli1.SendStream.Free; HttpCli1.SendStream := nil; end;end;procedure TForm1.HttpCli1RequestDone(Sender: TObject; RqType: THttpRequest; ErrCode: Word);var Data : String;begin// HttpCli1.SendStream.Free;// HttpCli1.SendStream := nil;// //ShowMessage(IntToStr(ErrCode));// if ErrCode <> 0 then //有异常// begin// HttpCli1.RcvdStream.Free;// HttpCli1.RcvdStream := nil;// Exit;// end;// if HttpCli1.StatusCode <> 200 then //返回错误// begin// HttpCli1.RcvdStream.Free;// HttpCli1.RcvdStream := nil;// Exit;// end;// HttpCli1.RcvdStream.Seek(0, 0);// SetLength(Data, HttpCli1.RcvdStream.Size);// HttpCli1.RcvdStream.Read(Data[1], Length(Data));end;end.
安装包和Demo下载: