TNetHttpClient的用法
TNetHttpClient的用法
TNetHttpClient是DELPHI XE8新增加的控件。
在之前,我们一般都是使用IDHTTP控件,但在安卓、IOS等非WINDOWS平台,IDHTTP访问HTTPS却不行了。
大家知道INDY的SSL访问局限于WINDOWS平台,并不支持跨平台HTTPS访问。
鉴于以上原因,所以EMB才推出了TNetHttpClient。
TNetHttpClient既可以阻塞(如同INDY),又可以异步(这就很全面了)。
TNetHttpClient不再和INDY一样依赖OPENSSL。
- 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^ <> #0 do
- begin
- case Sp^ of
- '+':
- Rp^ := ' ';
- '%':
- begin
- Inc(Sp);
- if Sp^ = '%' then
- Rp^ := '%'
- else
- begin
- Cp := Sp;
- Inc(Sp);
- if (Cp^ <> #0) and (Sp^ <> #0) 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(65001));
- vGBK := TStringStream.Create('', TEncoding.GetEncoding(936));
- try
- Memo1.Lines.Add('----------------阻塞----------------');
- with vHttp do
- begin
- vUTF8.Clear;
- ConnectionTimeout := 2000; // 2秒
- ResponseTimeout := 10000; // 10秒
- AcceptCharSet := 'utf-8';
- AcceptEncoding := '65001';
- 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, 1, Pos(':', E.Message) - 1) = 'Error sending data'
- then
- Memo1.Lines.Add('utf8:连接失败!')
- else if Copy(E.Message, 1, Pos(':', E.Message) - 1) = 'Error receiving data'
- then
- Memo1.Lines.Add('utf8:接收失败,请延长接收超时时间!')
- else
- Memo1.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 do
- begin
- Asynchronous := 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;
- 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(65001));
- try
- with vHttp do
- begin
- Memo1.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;
- finally
- vS.Free;
- vHttp.Free;
- end;
- Memo1.Lines.Add('--------------SSL异步--------------');
- with NetHTTPClient2 do
- begin
- Asynchronous := 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.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 := 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';
- 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, 1, Pos(':', E.Message) - 1) = 'Error sending data'
- then
- Memo1.Lines.Add('post:连接失败!')
- else if Copy(E.Message, 1, Pos(':', E.Message) - 1) = '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(65001))));
- end;
- procedure TForm1.NetHTTPClient2RequestCompleted(const Sender: TObject;
- const AResponse: IHTTPResponse);
- begin
- Memo1.Lines.Add('ssl:' + TNetEncoding.URL.UrlDecode(
- AResponse.ContentAsString(TEncoding.GetEncoding(65001))));
- end;
- end.
TNetHttpClient的用法的更多相关文章
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- python enumerate 用法
A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...
- [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...
- 【JavaScript】innerHTML、innerText和outerHTML的用法区别
用法: <div id="test"> <span style="color:red">test1</span> tes ...
- chattr用法
[root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...
- 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)
vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...
随机推荐
- oracle exists和 not exists 的用法
比如 a,b 关联列为 a.id = b.id,现在要取 a 中的数据,其中id在b中也存在: select * from a where exists(select 1 from b where b ...
- iOS中的分类(category)和类扩展(extension)
今天在研究swift的时候看到了分类和扩展.这是两个十分重要有用的功能,但是之前用的不多,没有深入了解过,在今天就从头理一遍. 一.分类(Category): 概念: 分类(Category)是OC中 ...
- CentOS linux7 设置开机启动服务
常用命令 描述 旧命令 新命令 使服务自动启动 chkconfig --level 3 http on syste ...
- 网络编程基础之TCP编程学习(一)
网络编程基础了解 socket套接字 socket是一种通讯机制,它包含一整套的调用接口和数据结构的定义,他给应用程序提供了使用如TCP/UDP等网络通讯的手段. linux中的网络编程通过socke ...
- flash多进程写操作
1 应用场景介绍 硬件条件:使用stm32 MCU 软件条件:协议栈应用 协议栈简单介绍如下: 类似于OSI七层模型,所涉及的协议栈包括应用层,网络层,链路层,物理层,如下图: 在 ...
- linux下18种监测网络带宽方式
1. nload nload是一个命令行工具,让用户可以分开来监控入站流量和出站流量.它还可以绘制图表以显示入站流量和出站流量,视图比例可以调整.用起来很简单,不支持许多选项. 所以,如果你只需要快速 ...
- Linux系统进程的知识总结,进程与线程之间的纠葛...
来源:嵌入式ARM 当一个程序开始执行后,在开始执行到执行完毕退出这段时间内,它在内存中的部分就叫称作一个进程. Linux 是一个多任务的操作系统,也就是说,在同一时间内,可以有多个进程同时执行.我 ...
- JDK源码那些事儿之红黑树基础下篇
说到HashMap,就一定要说到红黑树,红黑树作为一种自平衡二叉查找树,是一种用途较广的数据结构,在jdk1.8中使用红黑树提升HashMap的性能,今天就来说一说红黑树,上一讲已经给出插入平衡的调整 ...
- [唐胡璐]Selenium技巧 - 处理Windows程序(进程)
Selenium WebDriver java 提供了一个专门的WindowsUtils类去和Windows操作系统交互。 就像我们之前说过有时候跑完脚本后,IEDriverServer.exe进程没 ...
- kubectl 自动补全
kubectl 这个命令行工具非常重要,与之相关的命令也很多,我们也记不住那么多的命令,而且也会经常写错,所以命令自动补全是很有必要的,kubectl 工具本身就支持自动补全,只需简单设置一下即可. ...