1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  7. System.Classes, Vcl.Graphics,
  8. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Net.URLClient,
  9. System.Net.HttpClient, System.Net.HttpClientComponent, Vcl.StdCtrls;
  10.  
  11. type
  12. TForm1 = class(TForm)
  13. NetHTTPClient1: TNetHTTPClient;
  14. Button1: TButton;
  15. Memo1: TMemo;
  16. Button2: TButton;
  17. NetHTTPClient2: TNetHTTPClient;
  18. Button3: TButton;
  19. procedure Button1Click(Sender: TObject);
  20. procedure NetHTTPClient1RequestCompleted(const Sender: TObject;
  21. const AResponse: IHTTPResponse);
  22. procedure Button2Click(Sender: TObject);
  23. procedure NetHTTPClient2RequestCompleted(const Sender: TObject;
  24. const AResponse: IHTTPResponse);
  25. procedure Button3Click(Sender: TObject);
  26. private
  27. { Private declarations }
  28. public
  29. { Public declarations }
  30. end;
  31.  
  32. var
  33. Form1: TForm1;
  34.  
  35. implementation
  36.  
  37. uses System.NetEncoding;
  38.  
  39. {$R *.dfm}
  40.  
  41. function UrlDecode(const AStr: AnsiString): AnsiString;
  42. var
  43. Sp, Rp, Cp: PAnsiChar;
  44. s: AnsiString;
  45. begin
  46. SetLength(Result, Length(AStr));
  47. Sp := PAnsiChar(AStr);
  48. Rp := PAnsiChar(Result);
  49. Cp := Sp;
  50. while Sp^ <> # do
  51. begin
  52. case Sp^ of
  53. '+':
  54. Rp^ := ' ';
  55. '%':
  56. begin
  57. Inc(Sp);
  58. if Sp^ = '%' then
  59. Rp^ := '%'
  60. else
  61. begin
  62. Cp := Sp;
  63. Inc(Sp);
  64. if (Cp^ <> #) and (Sp^ <> #) then
  65. begin
  66. s := AnsiChar('$') + Cp^ + Sp^;
  67. Rp^ := AnsiChar(StrToInt(string(s)));
  68. end;
  69. end;
  70. Cp := Cp;
  71. end;
  72. else
  73. Rp^ := Sp^;
  74. end;
  75. Inc(Rp);
  76. Inc(Sp);
  77. end;
  78. SetLength(Result, Rp - PAnsiChar(Result));
  79. end;
  80.  
  81. procedure TForm1.Button1Click(Sender: TObject);
  82. var
  83. vHttp: TNetHTTPClient;
  84. vUTF8, vGBK: TStringStream;
  85. begin
  86. vHttp := TNetHTTPClient.Create(nil);
  87. vUTF8 := TStringStream.Create('', TEncoding.GetEncoding());
  88. vGBK := TStringStream.Create('', TEncoding.GetEncoding());
  89. try
  90. Memo1.Lines.Add('----------------阻塞----------------');
  91. with vHttp do
  92. begin
  93. vUTF8.Clear;
  94. ConnectionTimeout := ; // 2秒
  95. ResponseTimeout := ; // 10秒
  96. AcceptCharSet := 'utf-8';
  97. AcceptEncoding := '';
  98. AcceptLanguage := 'zh-CN';
  99. ContentType := 'text/html';
  100. UserAgent := 'Embarcadero URI Client/1.0';
  101. try
  102. Get('http://offeu.com/utf8.txt', vUTF8);
  103. Memo1.Lines.Add('utf8:' + TNetEncoding.URL.UrlDecode(vUTF8.DataString));
  104. except
  105. on E: Exception do
  106. // Error sending data: (12002) 操作超时.
  107. // Error receiving data: (12002) 操作超时
  108. if Copy(E.Message, , Pos(':', E.Message) - ) = 'Error sending data'
  109. then
  110. Memo1.Lines.Add('utf8:连接失败!')
  111. else if Copy(E.Message, , Pos(':', E.Message) - ) = 'Error receiving data'
  112. then
  113. Memo1.Lines.Add('utf8:接收失败,请延长接收超时时间!')
  114. else
  115. Memo1.Lines.Add('utf8:' + E.Message);
  116. end;
  117. vGBK.Clear;
  118. AcceptCharSet := 'gbk';
  119. AcceptEncoding := '';
  120. AcceptLanguage := 'zh-CN';
  121. ContentType := 'text/html';
  122. UserAgent := 'Embarcadero URI Client/1.0';
  123. Get('http://offeu.com/gbk.txt', vGBK);
  124. Memo1.Lines.Add('gbk:' + string(UrlDecode(AnsiString(vGBK.DataString))));
  125. end;
  126. Memo1.Lines.Add('----------------异步----------------');
  127. with NetHTTPClient1 do
  128. begin
  129. Asynchronous := true;
  130. ConnectionTimeout := ; // 10秒
  131. ResponseTimeout := ; // 10秒
  132. AcceptCharSet := 'utf-8';
  133. AcceptEncoding := '';
  134. AcceptLanguage := 'zh-CN';
  135. ContentType := 'text/html';
  136. UserAgent := 'Embarcadero URI Client/1.0';
  137. Get('http://offeu.com/utf8.txt');
  138. end;
  139. finally
  140. vUTF8.Free;
  141. vGBK.Free;
  142. vHttp.Free;
  143. end;
  144. end;
  145.  
  146. procedure TForm1.Button2Click(Sender: TObject);
  147. var
  148. vHttp: TNetHTTPClient;
  149. vS: TStringStream;
  150. begin
  151. // 这里用的 APPCODE 是阿里云市场中的api,需要申请。
  152. vHttp := TNetHTTPClient.Create(nil);
  153. vS := TStringStream.Create('', TEncoding.GetEncoding());
  154. try
  155. with vHttp do
  156. begin
  157. Memo1.Lines.Add('--------------SSL阻塞--------------');
  158. vS.Clear;
  159. ConnectionTimeout := ; // 10秒
  160. ResponseTimeout := ; // 10秒
  161. CustomHeaders['Authorization'] :=
  162. 'APPCODE 你申请的appcode';
  163. Accept := 'application/json;';
  164. ContentType := 'application/json; charset=utf-8;';
  165. UserAgent := 'Embarcadero URI Client/1.0';
  166. Get('https://dm-81.data.aliyun.com/rest/160601/ip/getIpInfo.json?'
  167. + 'ip=60.191.244.5', vS);
  168. Memo1.Lines.Add('ssl:'
  169. + string(TNetEncoding.URL.UrlDecode(vS.DataString)));
  170. end;
  171. finally
  172. vS.Free;
  173. vHttp.Free;
  174. end;
  175. Memo1.Lines.Add('--------------SSL异步--------------');
  176. with NetHTTPClient2 do
  177. begin
  178. Asynchronous := true;
  179. ConnectionTimeout := ; // 10秒
  180. ResponseTimeout := ; // 10秒
  181. CustomHeaders['Authorization'] :=
  182. 'APPCODE 你申请的appcode';
  183. Accept := 'application/json;';
  184. ContentType := 'application/json; charset=utf-8;';
  185. UserAgent := 'Embarcadero URI Client/1.0';
  186. Get('https://dm-81.data.aliyun.com/rest/160601/ip/getIpInfo.json?'
  187. + 'ip=60.191.244.5');
  188. end;
  189. end;
  190.  
  191. procedure TForm1.Button3Click(Sender: TObject);
  192. var
  193. vHttp: TNetHTTPClient;
  194. vS: TStringStream;
  195. vList: TStrings;
  196. begin
  197. vHttp := TNetHTTPClient.Create(nil);
  198. vList := TStringList.Create;
  199. vS := TStringStream.Create;
  200. try
  201. Memo1.Lines.Add('----------------Post阻塞----------------');
  202. vS.Clear;
  203. with vHttp do
  204. begin
  205. ConnectionTimeout := ; // 2秒
  206. ResponseTimeout := ; // 10秒
  207. AcceptCharSet := 'utf-8';
  208. AcceptEncoding := '';
  209. AcceptLanguage := 'zh-CN';
  210. ContentType := 'text/html';
  211. UserAgent := 'Embarcadero URI Client/1.0';
  212. vList.Clear;
  213. vList.Values['id'] := 'test';
  214. vList.Values['pwd'] := 'test';
  215. vList.Values['cmd'] := '';
  216. try
  217. Post('http://60.191.220.219:8090', vList, vS); // utf8进gbk出
  218. // Memo1.Lines.Add('post:' + TNetEncoding.URL.UrlDecode(vS.DataString));
  219. Memo1.Lines.Add('post:' + vS.DataString);
  220. except
  221. on E: Exception do
  222. // Error sending data: (12002) 操作超时.
  223. // Error receiving data: (12002) 操作超时
  224. if Copy(E.Message, , Pos(':', E.Message) - ) = 'Error sending data'
  225. then
  226. Memo1.Lines.Add('post:连接失败!')
  227. else if Copy(E.Message, , Pos(':', E.Message) - ) = 'Error receiving data'
  228. then
  229. Memo1.Lines.Add('post:接收失败,请延长接收超时时间!')
  230. else
  231. Memo1.Lines.Add('post:' + E.Message);
  232. end;
  233. end;
  234. finally
  235. vS.Free;
  236. vList.Free;
  237. vHttp.Free;
  238. end;
  239. end;
  240.  
  241. procedure TForm1.NetHTTPClient1RequestCompleted(const Sender: TObject;
  242. const AResponse: IHTTPResponse);
  243. begin
  244. Memo1.Lines.Add('utf8:' + TNetEncoding.URL.UrlDecode(
  245. AResponse.ContentAsString(TEncoding.GetEncoding())));
  246. end;
  247.  
  248. procedure TForm1.NetHTTPClient2RequestCompleted(const Sender: TObject;
  249. const AResponse: IHTTPResponse);
  250. begin
  251. Memo1.Lines.Add('ssl:' + TNetEncoding.URL.UrlDecode(
  252. AResponse.ContentAsString(TEncoding.GetEncoding())));
  253. end;
  254.  
  255. end.

TNetHTTPClient 使用的更多相关文章

  1. TNetHTTPClient演示

    TNetHTTPClient演示 TNetHTTPClient是DELPHI新增加的异步HTTP通信控件(区别于INDY的阻塞控件). unit Unit1; interface uses Winap ...

  2. TNetHttpClient支持异步访问(Delphi 10.1 Berlin,红鱼儿的博客)

    Delphi 10.1进一步改进自Delphi 10带来的Http访问控件TNetHttpClient,支持异步访问,同时增加ConnectionTimeout及ResponseTimeout两个超时 ...

  3. Delphi 10.3.1 TNetHttpClient在多线程中存在的问题及解决方法。

    Delphi 10.3.1发布了,对10.3.0存在的各种问题,做了大量的修正.但听高勇说TNetHttpClient在多线程中存在问题,今天做了一下测试,确实如此,看来,还需要官方进一步修正! 具体 ...

  4. TNetHttpClient的用法

    TNetHttpClient的用法 TNetHttpClient是DELPHI XE8新增加的控件. 在之前,我们一般都是使用IDHTTP控件,但在安卓.IOS等非WINDOWS平台,IDHTTP访问 ...

  5. 使用http.sys,让delphi 的多层服务飞起来

    核心提示:一直以来,delphi 的网络通讯层都是以indy 为主,虽然indy 的功能非常多,涉及到网络服务的各个方面,但是对于大多数多层服务来说,就是需要一个快速.稳定.高效的传输层.Delphi ...

  6. FMX手机app,如何下载网站图片而不卡界面

    你用的版本? 你应该关注下delphi 更新说明第一方法: 可以用线程.第二方法: TNetHTTPClient 已经支持异步 TThread.CreateAnonymousThread( proce ...

  7. 移动开发的框架(用Firepower,不用listview,超快) good

    我是通过http传送xml后台是阿帕奇的http server,后台可以用delphi或php 都可以.用post 刚才试了试自带的TNetHttpClient,感觉还好,代码封装也不算深,收发数据也 ...

  8. 使用kbmmw 的REST 服务实现上传大文件

    我们在使用kbmmw的REST 服务时,经常会下载和上传大文件.例如100M以上的.kbmmw的rest服务中 提供标准的文件下载,上传功能,基本上就是打开文件,发送,接收,没有做特殊处理.这些对于文 ...

  9. kbmmw 做REST 服务签名认证的一种方式

    一般对外提供提供REST 服务,由于信息安全的问题, 都要采用签名认证,今天简单说一下在KBMMW 中如何 实现简单的签名服务? 整个签名服务,模仿阿里大鱼的认证方式,大家可以根据实际情况自己修改. ...

随机推荐

  1. winfrom datagridview ,picturebox,显示图片,以及删除问题

     private void write_listview(DataSet ds)         {             DataTable dt = ds.Tables[0];          ...

  2. (转)C# Xml进行序列化与反序列化

    ---------------------------------------------------------------文章1---------------------------------- ...

  3. Juniper基础配置

    root> show configuration | display set      配置按set行显示,查看的配置为未commit的配置(commit check)root# set sys ...

  4. java中的Sort函数,你值得看

    基于C语言中的sort如此这么方便,自然而然,java中也有类似C的sort函数. 1.普通数组:Arrays.sort(数组名,开始位置,结束位置). 2.类中属性排序: 模板: class A { ...

  5. DHCP机制

    DHCP概念:局域网的网络协议,使用UDP协议工作,在工作过程中,它有两个对象,DHCP客户端和DHCP服务端,DHCP服务运行在67端口和68端口. 用途:1)个内部网络或网络服务供应商自动分配IP ...

  6. HDU - 4456 cdq

    题意:给一个矩阵,两种操作1:修改单点的权值,2:查询和某个点曼哈顿距离小于r点的权值和 题解:先旋转坐标轴,(x,y)->(x-y,x+y)然后就变成了cdq分治裸题,子矩阵和和单点修改一维时 ...

  7. 更改 Windows 软件默认安装位置教程

    在打开的“运行”窗口中,输入命令regedit,然后点击确定按钮 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 百度 ...

  8. leetcode-algorithms-16 3Sum Closest

    leetcode-algorithms-16 3Sum Closest Given an array nums of n integers and an integer target, find th ...

  9. Spring Boot项目打包部署到外部Tomcat

    1.生成war包 1)修改POM文件,将打包类型改为war:<packaging>war</packaging> <packaging>war</packag ...

  10. 剑指offer-整数中1出现的次数

    题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...