Delphi XE新的http控件TNetHTTPClient

这篇具有很好参考价值的文章主要介绍了Delphi XE新的http控件TNetHTTPClient。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        众所周知,旧版的Delphi里面,自带的http请求控件是indy的http,indy的控件请求https的时候,需要依赖于opensll,并且异步这块并不好.

        新版的Delphi XE8以上的版本, 推出了TNetHttpClient,

        TNetHttpClient既可以阻塞(如同INDY),又可以异步(这就很全面了)。

        TNetHttpClient不再和INDY一样依赖OPENSSL。

先小小的尝试一下简单的post和get:

get:

function TForm3.http_get(sContentType, strData, url, self_head: string): string;
var
  NetHTTPClient : TNetHTTPClient;
   parametres : TStringStream;

begin
  try
    try
       NetHTTPClient := TNetHTTPClient.Create(nil);
       NetHTTPClient.ContentType :=sContentType;
       NetHTTPClient.AcceptEncoding := 'UTF-8';
       parametres := TStringStream.Create(strData, TEncoding.UTF8);
       Result := NetHTTPClient.get(url, parametres).ContentAsString(TEncoding.UTF8);
    finally
      freeandnil(parametres);
      freeandnil(NetHTTPClient);
    end;
  except
    on e: Exception do
    begin
//      log('get_出现异常 :' + e.Message);
      Result := e.Message;
    end;
  end;
end;

post:

function TForm3.http_post(sContentType, strData, url,
  self_head: string): string;
var
  NetHTTPClient : TNetHTTPClient;
   parametres : TStringStream;

begin
  try
    try
       NetHTTPClient := TNetHTTPClient.Create(nil);
       NetHTTPClient.ContentType :=sContentType;
       NetHTTPClient.AcceptEncoding := 'UTF-8';
       parametres := TStringStream.Create(strData, TEncoding.UTF8);
       Result := NetHTTPClient.Post(url, parametres).ContentAsString(TEncoding.UTF8);

    finally
      freeandnil(parametres);
      freeandnil(NetHTTPClient);
    end;
  except
    on e: Exception do
    begin
//      log('post_出现异常 :' + e.Message);
      Result := e.Message;
    end;
  end;
end;

我们再来看下Delphi官方对应这块的定义:

System.Net.HttpClient.THTTPClient.Post

Delphi

function Post(const AURL: string; const ASourceFile: string; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;
function Post(const AURL: string; const ASource: TStrings; const AResponseContent: TStream = nil;  const AEncoding: TEncoding = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;
function Post(const AURL: string; const ASource: TStream; const AResponseContent: TStream = nil;  const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;
function Post(const AURL: string; const ASource: TMultipartFormData; const AResponseContent: TStream = nil;  const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;

C++

_di_IHTTPResponse __fastcall Post(const System::UnicodeString AURL, const System::UnicodeString ASourceFile, System::Classes::TStream* const AResponseContent = (System::Classes::TStream*)(0x0), const System::DynamicArray<System::Net::Urlclient::TNameValuePair> AHeaders = System::DynamicArray<System::Net::Urlclient::TNameValuePair>())/* overload */;
_di_IHTTPResponse __fastcall Post(const System::UnicodeString AURL, System::Classes::TStrings* const ASource, System::Classes::TStream* const AResponseContent = (System::Classes::TStream*)(0x0), System::Sysutils::TEncoding* const AEncoding = (System::Sysutils::TEncoding*)(0x0), const System::DynamicArray<System::Net::Urlclient::TNameValuePair> AHeaders = System::DynamicArray<System::Net::Urlclient::TNameValuePair>())/* overload */;
_di_IHTTPResponse __fastcall Post(const System::UnicodeString AURL, System::Classes::TStream* const ASource, System::Classes::TStream* const AResponseContent = (System::Classes::TStream*)(0x0), const System::DynamicArray<System::Net::Urlclient::TNameValuePair> AHeaders = System::DynamicArray<System::Net::Urlclient::TNameValuePair>())/* overload */;
_di_IHTTPResponse __fastcall Post(const System::UnicodeString AURL, System::Net::Mime::TMultipartFormData* const ASource, System::Classes::TStream* const AResponseContent = (System::Classes::TStream*)(0x0), const System::DynamicArray<System::Net::Urlclient::TNameValuePair> AHeaders = System::DynamicArray<System::Net::Urlclient::TNameValuePair>())/* overload */;

System.Net.HttpClient.THTTPClient.Get

  • Up to Parent: THTTPClient

Delphi

function Get(const AURL: string; const AResponseContent: TStream = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse;

C++

_di_IHTTPResponse __fastcall Get(const System::UnicodeString AURL, System::Classes::TStream* const AResponseContent = (System::Classes::TStream*)(0x0), const System::DynamicArray<System::Net::Urlclient::TNameValuePair> AHeaders = System::DynamicArray<System::Net::Urlclient::TNameValuePair>());

我们可以看到官方给与的这个新控件的定义及使用也很简单,下面我们自己创建个单元进行更深入的测试 文章来源地址https://www.toymoban.com/news/detail-738398.html

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.

到了这里,关于Delphi XE新的http控件TNetHTTPClient的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • lazarus、delphi文件Http下载断点续传的实现

    下载大文件时,断点续传是很有必要的,特别是网速度慢且不稳定的情况下,很难保证不出意外,一旦意外中断,又要从头下载,会很让人抓狂。断点续传就能很好解决意外中断情况,再次下载时不需要从头下载,从上次中断处继续下载即可,这样下载几G或十几G大小的一个

    2024年02月13日
    浏览(51)
  • 新的“HTTP/2 Rapid Reset”0day攻击打破了DDoS记录

    Cloudflare解释称,HTTP/2代理或负载均衡器特别容易受到快速发送的重置请求的影响。在TLS代理和上游对等点之间,该公司的网络被压垮,因此坏请求在达到阻止点之前就已经造成了损害。从实际影响来看,这些攻击导致Cloudflare的客户报告的502错误数量增加。Cloudflare表示,他们

    2024年02月07日
    浏览(38)
  • 如何在gitlub上拉取新的文件到idea© with ssh 和 copy with http的区别

    2、选中要pull的分支,点击copy 并选择 copy with ssh或者copy  with http (两者区别会在下面进行阐述)点击复制地址 3、打开idea  File —New —Project from Version Controller 4、在URL出复制刚才粘贴的地址后点击clone 进行项目拉取操作(pull后不要忘记对以来的Maven进行导入) 二、gitlub中的

    2024年02月03日
    浏览(33)
  • Oracle XE版安装与用户操作

    安装 安装Oracle数据库 资源 1)OracleXE112_Win64.zip 数据库服务管理平台 2)plsqldeveloper_x64.rar 第三方客户端 Oracle是一家软件公司。这家1977成立于加利福尼亚的软件公司是世界上第一个推出关系型数据管理系统(RDBMS)的公司。 现在,他们的RDBMS被广泛应用于各种操作环境:Windo

    2024年02月07日
    浏览(32)
  • CVE-2023-20198:思科 IOS XE 零日漏洞

    2023年10月17日, Cisco 发布了 IOS XE 软件 的风险通告,漏洞编号为 CVE-2023-20198 ,影响所有启用了 Web UI 功能的 Cisco IOS XE 设备,漏洞等级: 高危 ,漏洞评分: 10 。该漏洞已出现 在野利用 。 Web UI 是一种基于 GUI 的嵌入式系统管理工具,能够提供系统配置、简化系统部署和可管

    2024年02月06日
    浏览(49)
  • STM32F103xC,xD,xE引脚定义

    由于在使用STM32系列芯片过程中发现互联网没有整理好的引脚定义,因此自己整理一份,方便以后查阅。 Pin 重新上电时的功能 默认功能 重映射 PA0 PA0 WKUP/USART2_CTS/ADC123_IN0/TIM2_CH1_ETR/TIM5_CH1/TIM8_ETR PA1 PA1 USART2_RTS/ADC123_IN1/TIM5_CH2/TIM2/CH2 PA2 PA2 USART2_TX/TIM5_CH3/ADC123_IN2/TIM2_CH3 PA3 PA3 U

    2024年03月09日
    浏览(52)
  • 配置vue项目启动后自动打开浏览器,出现网址跳转错误问题:网址为http://0.0.0.0:8080/ 的页面可能存在问题,或者已永久移动到新的网址。

    我们在Vue项目package.js文件里配置启动后启动后自动打开浏览器时,也就是加上–open 会出现以下问题: 解决方法: 在vue.config.js文件里做修改:

    2024年02月11日
    浏览(56)
  • VS2017+Fortran(Intel Parallel Studio XE 2018)+MPI

    相关文件资源 : VS 2017 提取码:hyz3 Fortran (Intel Parallel Studio XE 2018) 提取码:arn5 MPI 提取码:kgo6 环境 :Win10操作系统 安装顺序 : 1、先安装VS2017,解压文件直接安装即可,安装时需要安装C++这个库,为了后续和Intel Parallel Studio XE 2018一起集成。 2、先关闭VS2017的窗口,再继续

    2024年02月09日
    浏览(39)
  • 【漏洞修复】Cisco IOS XE软件Web UI权限提升漏洞及修复方法

    关于Cisco IOS XE软件Web UI权限提升漏洞及修复方法 Cisco IOS XE Unauthenticatd Remote Command Execution (CVE-2023-20198) (Direct Check) Severity:Critical Vulnerability Priority Rating (VPR): 10.0 Risk Factor: Critical CVSS v3.0 Base Score 10.0 运行Cisco IOS XE软件版本 16.x及更高版本 的产品才会受到影响。 Nexus产品、ACI、传

    2024年02月03日
    浏览(40)
  • 【MySQL】报错 Incorrect string value: ‘\xE5\xA4\xA9\xE5\x96\x9C‘ for column的解决方法

    在向数据库中插入中文时遇到报错 Incorrect string value: \\\'xE5xA4xA9xE5x96x9C\\\' for column ,此时为数据库的编码格式有问题,可以按照如下方法修改 使用 show create table 表名 查看数据库表信息: 可以看到此时的数据库编码格式为 latin 输入以下sql语句将某一字段的 字符集和校验规则

    2024年02月22日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包