Delphi使用进行post数据时超时设置

因项目需要进行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;

interface

uses
  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下载:

http://download.csdn.net/detail/tc310/9384426