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的用法的更多相关文章

  1. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  2. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  8. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  9. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

随机推荐

  1. 安卓已过时的ProgressDialog对话框

    private ProgressDialog mDialog; private Handler mHandler; //初始化Handler //初始化 mDialog = new ProgressD ...

  2. 【SSH学习笔记】浅谈SSH框架

    说在前面 本学期我们有一门课叫做Java EE,由陈老师所授,主要讲的就是Java EE 中的SSH框架. 由于陈老师授课风格以及自己的原因导致学了整整一学期不知道在讲什么,所以才有了自己重新学习总结 ...

  3. Docker pull下载出现 error pulling image configuration:

    出现这个问题,并且在错误信息的最后附带 net/http: TLS handshake timeout: 猜测是docker的相关配置问题,导致无法通过TLS握手 执行如下命令修改配置 echo &q ...

  4. JDK源码那些事儿之红黑树基础上篇

    说到HashMap,就一定要说到红黑树,红黑树作为一种自平衡二叉查找树,是一种用途较广的数据结构,在jdk1.8中使用红黑树提升HashMap的性能,今天就来说一说红黑树. 前言 限于篇幅,本文只对红 ...

  5. DataWorks入门

    阿里云有很多成熟的云产品(萌新认知),我自己只用过腾讯云的对象存储,对这类云产品不是特别了解. 有幸参与到大数据相关的项目,跟着学了点工具的使用方法,非常简单,也了解了一些使用大数据分析问题的流程. ...

  6. Spring Bean装配(下)——注解

    @Repository,@Service,@Controller这三个注解是基于component定义的注解 component-scan:组件扫描 base-package:扫描这个下的所有类 &l ...

  7. gitlab自动备份脚本auto_backup_to_remote

    !/bin/bash gitlab 服务器备份路径 LocalBackDir=/var/opt/gitlab/backups 远程备份服务器 gitlab备份文件存放路径 RemoteBackDir= ...

  8. java后台表单字符串长度验证

    1.方法封装前提实体类属性去除首尾空白并进行反转义 //实体类属性的get方法 public String getContent() { if(!"".equals(字符串属性名) ...

  9. Vue 组件的通信

    vue不得不了解的就是组件间的数据通信(暂且不谈vuex插件). 通信方式根据组件之间的关系有不同之处. 组件关系有下面三种:父-->子.子-->父.非父子 1.父-->子 父向子传 ...

  10. python自动华 (十七)

    Python自动化 [第十七篇]:jQuery介绍 jQuery jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多),对jav ...