TNetHTTPClient 使用
- unit Unit1;
- interface
- uses
- Winapi.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;
- type
- TForm1 = class(TForm)
- NetHTTPClient1: TNetHTTPClient;
- Button1: TButton;
- Memo1: TMemo;
- Button2: TButton;
- NetHTTPClient2: TNetHTTPClient;
- Button3: TButton;
- procedure Button1Click(Sender: TObject);
- procedure NetHTTPClient1RequestCompleted(const Sender: TObject;
- const AResponse: IHTTPResponse);
- procedure Button2Click(Sender: TObject);
- procedure NetHTTPClient2RequestCompleted(const Sender: TObject;
- const AResponse: IHTTPResponse);
- procedure Button3Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- uses System.NetEncoding;
- {$R *.dfm}
- function UrlDecode(const AStr: AnsiString): AnsiString;
- var
- Sp, Rp, Cp: PAnsiChar;
- s: AnsiString;
- begin
- SetLength(Result, Length(AStr));
- Sp := PAnsiChar(AStr);
- Rp := PAnsiChar(Result);
- Cp := Sp;
- while Sp^ <> # do
- begin
- case Sp^ of
- '+':
- Rp^ := ' ';
- '%':
- begin
- Inc(Sp);
- if Sp^ = '%' then
- Rp^ := '%'
- else
- begin
- Cp := Sp;
- Inc(Sp);
- if (Cp^ <> #) and (Sp^ <> #) then
- begin
- s := AnsiChar('$') + Cp^ + Sp^;
- Rp^ := AnsiChar(StrToInt(string(s)));
- end;
- end;
- Cp := Cp;
- end;
- else
- Rp^ := Sp^;
- end;
- Inc(Rp);
- Inc(Sp);
- end;
- SetLength(Result, Rp - PAnsiChar(Result));
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- var
- vHttp: TNetHTTPClient;
- vUTF8, vGBK: TStringStream;
- begin
- vHttp := TNetHTTPClient.Create(nil);
- vUTF8 := TStringStream.Create('', TEncoding.GetEncoding());
- vGBK := TStringStream.Create('', TEncoding.GetEncoding());
- try
- Memo1.Lines.Add('----------------阻塞----------------');
- with vHttp do
- begin
- vUTF8.Clear;
- ConnectionTimeout := ; // 2秒
- ResponseTimeout := ; // 10秒
- AcceptCharSet := 'utf-8';
- AcceptEncoding := '';
- AcceptLanguage := 'zh-CN';
- ContentType := 'text/html';
- UserAgent := 'Embarcadero URI Client/1.0';
- try
- Get('http://offeu.com/utf8.txt', vUTF8);
- Memo1.Lines.Add('utf8:' + TNetEncoding.URL.UrlDecode(vUTF8.DataString));
- except
- on E: Exception do
- // Error sending data: (12002) 操作超时.
- // Error receiving data: (12002) 操作超时
- if Copy(E.Message, , Pos(':', E.Message) - ) = 'Error sending data'
- then
- Memo1.Lines.Add('utf8:连接失败!')
- else if Copy(E.Message, , Pos(':', E.Message) - ) = 'Error receiving data'
- then
- Memo1.Lines.Add('utf8:接收失败,请延长接收超时时间!')
- else
- Memo1.Lines.Add('utf8:' + E.Message);
- end;
- vGBK.Clear;
- AcceptCharSet := 'gbk';
- AcceptEncoding := '';
- 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 do
- begin
- Asynchronous := true;
- ConnectionTimeout := ; // 10秒
- ResponseTimeout := ; // 10秒
- AcceptCharSet := 'utf-8';
- AcceptEncoding := '';
- AcceptLanguage := 'zh-CN';
- ContentType := 'text/html';
- UserAgent := 'Embarcadero URI Client/1.0';
- Get('http://offeu.com/utf8.txt');
- end;
- finally
- vUTF8.Free;
- vGBK.Free;
- vHttp.Free;
- end;
- end;
- procedure TForm1.Button2Click(Sender: TObject);
- var
- vHttp: TNetHTTPClient;
- vS: TStringStream;
- begin
- // 这里用的 APPCODE 是阿里云市场中的api,需要申请。
- vHttp := TNetHTTPClient.Create(nil);
- vS := TStringStream.Create('', TEncoding.GetEncoding());
- try
- with vHttp do
- begin
- Memo1.Lines.Add('--------------SSL阻塞--------------');
- vS.Clear;
- ConnectionTimeout := ; // 10秒
- ResponseTimeout := ; // 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;
- finally
- vS.Free;
- vHttp.Free;
- end;
- Memo1.Lines.Add('--------------SSL异步--------------');
- with NetHTTPClient2 do
- begin
- Asynchronous := true;
- ConnectionTimeout := ; // 10秒
- ResponseTimeout := ; // 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.Button3Click(Sender: TObject);
- var
- vHttp: TNetHTTPClient;
- vS: TStringStream;
- vList: TStrings;
- begin
- vHttp := TNetHTTPClient.Create(nil);
- vList := TStringList.Create;
- vS := TStringStream.Create;
- try
- Memo1.Lines.Add('----------------Post阻塞----------------');
- vS.Clear;
- with vHttp do
- begin
- ConnectionTimeout := ; // 2秒
- ResponseTimeout := ; // 10秒
- AcceptCharSet := 'utf-8';
- AcceptEncoding := '';
- 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'] := '';
- try
- Post('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);
- except
- on E: Exception do
- // Error sending data: (12002) 操作超时.
- // Error receiving data: (12002) 操作超时
- if Copy(E.Message, , Pos(':', E.Message) - ) = 'Error sending data'
- then
- Memo1.Lines.Add('post:连接失败!')
- else if Copy(E.Message, , Pos(':', E.Message) - ) = 'Error receiving data'
- then
- Memo1.Lines.Add('post:接收失败,请延长接收超时时间!')
- else
- Memo1.Lines.Add('post:' + E.Message);
- end;
- end;
- finally
- vS.Free;
- vList.Free;
- vHttp.Free;
- end;
- end;
- procedure TForm1.NetHTTPClient1RequestCompleted(const Sender: TObject;
- const AResponse: IHTTPResponse);
- begin
- Memo1.Lines.Add('utf8:' + TNetEncoding.URL.UrlDecode(
- AResponse.ContentAsString(TEncoding.GetEncoding())));
- end;
- procedure TForm1.NetHTTPClient2RequestCompleted(const Sender: TObject;
- const AResponse: IHTTPResponse);
- begin
- Memo1.Lines.Add('ssl:' + TNetEncoding.URL.UrlDecode(
- AResponse.ContentAsString(TEncoding.GetEncoding())));
- end;
- end.
TNetHTTPClient 使用的更多相关文章
- TNetHTTPClient演示
TNetHTTPClient演示 TNetHTTPClient是DELPHI新增加的异步HTTP通信控件(区别于INDY的阻塞控件). unit Unit1; interface uses Winap ...
- TNetHttpClient支持异步访问(Delphi 10.1 Berlin,红鱼儿的博客)
Delphi 10.1进一步改进自Delphi 10带来的Http访问控件TNetHttpClient,支持异步访问,同时增加ConnectionTimeout及ResponseTimeout两个超时 ...
- Delphi 10.3.1 TNetHttpClient在多线程中存在的问题及解决方法。
Delphi 10.3.1发布了,对10.3.0存在的各种问题,做了大量的修正.但听高勇说TNetHttpClient在多线程中存在问题,今天做了一下测试,确实如此,看来,还需要官方进一步修正! 具体 ...
- TNetHttpClient的用法
TNetHttpClient的用法 TNetHttpClient是DELPHI XE8新增加的控件. 在之前,我们一般都是使用IDHTTP控件,但在安卓.IOS等非WINDOWS平台,IDHTTP访问 ...
- 使用http.sys,让delphi 的多层服务飞起来
核心提示:一直以来,delphi 的网络通讯层都是以indy 为主,虽然indy 的功能非常多,涉及到网络服务的各个方面,但是对于大多数多层服务来说,就是需要一个快速.稳定.高效的传输层.Delphi ...
- FMX手机app,如何下载网站图片而不卡界面
你用的版本? 你应该关注下delphi 更新说明第一方法: 可以用线程.第二方法: TNetHTTPClient 已经支持异步 TThread.CreateAnonymousThread( proce ...
- 移动开发的框架(用Firepower,不用listview,超快) good
我是通过http传送xml后台是阿帕奇的http server,后台可以用delphi或php 都可以.用post 刚才试了试自带的TNetHttpClient,感觉还好,代码封装也不算深,收发数据也 ...
- 使用kbmmw 的REST 服务实现上传大文件
我们在使用kbmmw的REST 服务时,经常会下载和上传大文件.例如100M以上的.kbmmw的rest服务中 提供标准的文件下载,上传功能,基本上就是打开文件,发送,接收,没有做特殊处理.这些对于文 ...
- kbmmw 做REST 服务签名认证的一种方式
一般对外提供提供REST 服务,由于信息安全的问题, 都要采用签名认证,今天简单说一下在KBMMW 中如何 实现简单的签名服务? 整个签名服务,模仿阿里大鱼的认证方式,大家可以根据实际情况自己修改. ...
随机推荐
- winfrom datagridview ,picturebox,显示图片,以及删除问题
private void write_listview(DataSet ds) { DataTable dt = ds.Tables[0]; ...
- (转)C# Xml进行序列化与反序列化
---------------------------------------------------------------文章1---------------------------------- ...
- Juniper基础配置
root> show configuration | display set 配置按set行显示,查看的配置为未commit的配置(commit check)root# set sys ...
- java中的Sort函数,你值得看
基于C语言中的sort如此这么方便,自然而然,java中也有类似C的sort函数. 1.普通数组:Arrays.sort(数组名,开始位置,结束位置). 2.类中属性排序: 模板: class A { ...
- DHCP机制
DHCP概念:局域网的网络协议,使用UDP协议工作,在工作过程中,它有两个对象,DHCP客户端和DHCP服务端,DHCP服务运行在67端口和68端口. 用途:1)个内部网络或网络服务供应商自动分配IP ...
- HDU - 4456 cdq
题意:给一个矩阵,两种操作1:修改单点的权值,2:查询和某个点曼哈顿距离小于r点的权值和 题解:先旋转坐标轴,(x,y)->(x-y,x+y)然后就变成了cdq分治裸题,子矩阵和和单点修改一维时 ...
- 更改 Windows 软件默认安装位置教程
在打开的“运行”窗口中,输入命令regedit,然后点击确定按钮 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 百度 ...
- leetcode-algorithms-16 3Sum Closest
leetcode-algorithms-16 3Sum Closest Given an array nums of n integers and an integer target, find th ...
- Spring Boot项目打包部署到外部Tomcat
1.生成war包 1)修改POM文件,将打包类型改为war:<packaging>war</packaging> <packaging>war</packag ...
- 剑指offer-整数中1出现的次数
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...