本文整理自网络,侵删。
TNetHTTPClient演示
TNetHTTPClient是DELPHI新增加的异步HTTP通信控件(区别于INDY的阻塞控件)。
unit Unit1;
interface
usesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Net.URLClient,System.Net.HttpClient, System.Net.HttpClientComponent, Vcl.StdCtrls;
typeTForm1 = class(TForm)NetHTTPClient1: TNetHTTPClient;btnGet: TButton;Memo1: TMemo;btnSsl: TButton;NetHTTPClient2: TNetHTTPClient;btnPost: TButton;procedure btnGetClick(Sender: TObject);procedure NetHTTPClient1RequestCompleted(const Sender: TObject;const AResponse: IHTTPResponse);procedure btnSslClick(Sender: TObject);procedure NetHTTPClient2RequestCompleted(const Sender: TObject;const AResponse: IHTTPResponse);procedure btnPostClick(Sender: TObject);private{ Private declarations }public{ Public declarations }end;
varForm1: TForm1;
implementation
uses System.NetEncoding;
{$R *.dfm}
function UrlDecode(const AStr: AnsiString): AnsiString;varSp, Rp, Cp: PAnsiChar;s: AnsiString;beginSetLength(Result, Length(AStr));Sp := PAnsiChar(AStr);Rp := PAnsiChar(Result);Cp := Sp;while Sp^ <> #0 dobegincase Sp^ of'+':Rp^ := ' ';'%':beginInc(Sp);if Sp^ = '%' thenRp^ := '%'elsebeginCp := Sp;Inc(Sp);if (Cp^ <> #0) and (Sp^ <> #0) thenbegins := AnsiChar('$') + Cp^ + Sp^;Rp^ := AnsiChar(StrToInt(string(s)));end;end;Cp := Cp;end;elseRp^ := Sp^;end;Inc(Rp);Inc(Sp);end;SetLength(Result, Rp - PAnsiChar(Result));end;
procedure TForm1.btnGetClick(Sender: TObject);varvHttp: TNetHTTPClient;vUTF8, vGBK: TStringStream;beginvHttp := TNetHTTPClient.Create(nil);vUTF8 := TStringStream.Create('', TEncoding.GetEncoding(65001));vGBK := TStringStream.Create('', TEncoding.GetEncoding(936));tryMemo1.Lines.Add('----------------阻塞----------------');with vHttp dobeginvUTF8.Clear;ConnectionTimeout := 2000; // 2秒ResponseTimeout := 10000; // 10秒AcceptCharSet := 'utf-8';AcceptEncoding := '65001';AcceptLanguage := 'zh-CN';ContentType := 'text/html';UserAgent := 'Embarcadero URI Client/1.0';tryGet('http://offeu.com/utf8.txt', vUTF8);Memo1.Lines.Add('utf8:' + TNetEncoding.URL.UrlDecode(vUTF8.DataString));excepton E: Exception do// Error sending data: (12002) 操作超时.// Error receiving data: (12002) 操作超时if Copy(E.Message, 1, Pos(':', E.Message) - 1) = 'Error sending data'thenMemo1.Lines.Add('utf8:连接失败!')else if Copy(E.Message, 1, Pos(':', E.Message) - 1) = 'Error receiving data'thenMemo1.Lines.Add('utf8:接收失败,请延长接收超时时间!')elseMemo1.Lines.Add('utf8:' + E.Message);end;vGBK.Clear;AcceptCharSet := 'gbk';AcceptEncoding := '936';AcceptLanguage := 'zh-CN';ContentType := 'text/html';UserAgent := 'Embarcadero URI Client/1.0';Get('http://offeu.com/gbk.txt', vGBK);Memo1.Lines.Add('gbk:' + string(UrlDecode(AnsiString(vGBK.DataString))));end;Memo1.Lines.Add('----------------异步----------------');with NetHTTPClient1 dobeginAsynchronous := true;ConnectionTimeout := 10000; // 10秒ResponseTimeout := 10000; // 10秒AcceptCharSet := 'utf-8';AcceptEncoding := '65001';AcceptLanguage := 'zh-CN';ContentType := 'text/html';UserAgent := 'Embarcadero URI Client/1.0';Get('http://offeu.com/utf8.txt');end;finallyvUTF8.Free;vGBK.Free;vHttp.Free;end;end;
procedure TForm1.btnSslClick(Sender: TObject);varvHttp: TNetHTTPClient;vS: TStringStream;begin// 这里用的 APPCODE 是阿里云市场中的api,需要申请。vHttp := TNetHTTPClient.Create(nil);vS := TStringStream.Create('', TEncoding.GetEncoding(65001));trywith vHttp dobeginMemo1.Lines.Add('--------------SSL阻塞--------------');vS.Clear;ConnectionTimeout := 10000; // 10秒ResponseTimeout := 10000; // 10秒CustomHeaders['Authorization'] :='APPCODE 你申请的appcode';Accept := 'application/json;';ContentType := 'application/json; charset=utf-8;';UserAgent := 'Embarcadero URI Client/1.0';Get('https://dm-81.data.aliyun.com/rest/160601/ip/getIpInfo.json?'+ 'ip=60.191.244.5', vS);Memo1.Lines.Add('ssl:'+ string(TNetEncoding.URL.UrlDecode(vS.DataString)));end;finallyvS.Free;vHttp.Free;end;Memo1.Lines.Add('--------------SSL异步--------------');with NetHTTPClient2 dobeginAsynchronous := true;ConnectionTimeout := 10000; // 10秒ResponseTimeout := 10000; // 10秒CustomHeaders['Authorization'] :='APPCODE 你申请的appcode';Accept := 'application/json;';ContentType := 'application/json; charset=utf-8;';UserAgent := 'Embarcadero URI Client/1.0';Get('https://dm-81.data.aliyun.com/rest/160601/ip/getIpInfo.json?'+ 'ip=60.191.244.5');end;end;
procedure TForm1.btnPostClick(Sender: TObject);varvHttp: TNetHTTPClient;vS: TStringStream;vList: TStrings;beginvHttp := TNetHTTPClient.Create(nil);vList := TStringList.Create;vS := TStringStream.Create;tryMemo1.Lines.Add('----------------Post阻塞----------------');vS.Clear;with vHttp dobeginConnectionTimeout := 2000; // 2秒ResponseTimeout := 10000; // 10秒AcceptCharSet := 'utf-8';AcceptEncoding := '65001';AcceptLanguage := 'zh-CN';ContentType := 'text/html';UserAgent := 'Embarcadero URI Client/1.0';vList.Clear;vList.Values['id'] := 'test';vList.Values['pwd'] := 'test';vList.Values['cmd'] := '1';tryPost('http://60.191.220.219:8090', vList, vS); // utf8进gbk出// Memo1.Lines.Add('post:' + TNetEncoding.URL.UrlDecode(vS.DataString));Memo1.Lines.Add('post:' + vS.DataString);excepton E: Exception do// Error sending data: (12002) 操作超时.// Error receiving data: (12002) 操作超时if Copy(E.Message, 1, Pos(':', E.Message) - 1) = 'Error sending data'thenMemo1.Lines.Add('post:连接失败!')else if Copy(E.Message, 1, Pos(':', E.Message) - 1) = 'Error receiving data'thenMemo1.Lines.Add('post:接收失败,请延长接收超时时间!')elseMemo1.Lines.Add('post:' + E.Message);end;end;finallyvS.Free;vList.Free;vHttp.Free;end;end;
procedure TForm1.NetHTTPClient1RequestCompleted(const Sender: TObject;const AResponse: IHTTPResponse);beginMemo1.Lines.Add('utf8:' + TNetEncoding.URL.UrlDecode(AResponse.ContentAsString(TEncoding.GetEncoding(65001))));end;
procedure TForm1.NetHTTPClient2RequestCompleted(const Sender: TObject;const AResponse: IHTTPResponse);beginMemo1.Lines.Add('ssl:' + TNetEncoding.URL.UrlDecode(AResponse.ContentAsString(TEncoding.GetEncoding(65001))));end;
end.
相关阅读 >>
Delphi中webbrowser(或者embeddedwebbrowser)控件打开部分网站报“invalid floating point operation”异常的解决方法
Delphi android device information
Delphi 用 superobject 解析淘宝上的 json 数据
Delphi idhttpserver实现webservice
更多相关阅读请进入《Delphi》频道 >>