delphi Restful:客户端实现的四种方式及其比较

本文详细介绍了在 Delphi XE 中实现 RESTful 客户端的四种主要方式,包括 NetHTTP 技术体系、REST 技术体系、Indy 技术体系以及浏览器客户端技术体系。对比了各种技术的优势与劣势,并提供了丰富的代码示例和资源链接,适合 Delphi 开发者学习 RESTful 客户端开发。

delphi Restful:客户端实现的四种方式

摘要:


一、NetHTTP技术体系:  TNetHTTPClient;   TNetHTTPRequest
二、REST技术体系:
       TRESTClient; TRESTRequest; TRESTResponse; TRESTResponseDataSetAdapter
三、Indy技术体系:IdHTTP + IdSSLOpenSSL 
四、浏览器客户端技术体系:JavaScript+jQuery(Mobile)+Http DOM+Ajax

一、NetHTTP技术体系:

System.Net.HttpClient;  System.Net.URLClient;  System.Net.FileClient; 

System.Net.Mime;  System.Net.Socket;  System.Net.HttpClientComponent;  

非常强大!

优势:

    DX原生的:仅取决于操作系统,操作系统升级后,部署及其代码不会受到任何影响;不受组件的版本影响;可方便地Rest

    既能很好的支持TSession会话方式的基本鉴权,又能很好的支持AccessToken访问令牌方式或代码方式的高级鉴权,有专门的非可视化鉴权类(TCertificateList = class(TList<TCertificate>);)支持,需要自己写代码去实现

    异常处理:强大、方便。

属系统运行时刻库

C:\Program Files (x86)\Embarcadero\Studio\20.0\source\rtl\net 

对应的原生组件:   

    NetHTTPClient1: TNetHTTPClient;
    NetHTTPRequest1: TNetHTTPRequest;

既可直接使用组件

NetHTTPClient1: TNetHTTPClient;      NetHTTPRequest1: TNetHTTPRequest;

也可以不使用组件,而动态产生

官方案例1:同步多线程文件分段下载:  

    D:\开发测试\Samples\Object Pascal\RTL\HttpDownload\HttpDownloadDemo.dproj

    C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\RTL\HttpDownload

官方案例2:异步单线程文件下载:  

    D:\开发测试\Samples\Object Pascal\RTL\HttpAsyncDownload\HttpAsyncDownloadDemo.dproj

    C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\RTL\HttpAsyncDownload

第三方案例3:HTTPClient的Rest方法获取Json数据&并行库未来&异步任务

    D:\开发测试\Samples\其它\myTestCode\DelphiCookbookThirdEdition\Chapter05\CODE\RECIPE07\

    var
      MainForm: TMainForm;

    implementation

    uses
      System.Net.HTTPClient, System.JSON
      , AsyncTask
      , Converters
      ;

    {$R *.dfm}

    const
      ACCESS_KEY = '58297a8c75e21d218b1da2c610b6f62c'; 

        //:Token鉴权思路:初次给常数,下载令牌文件,再次登录验证令牌办法的合法性

    procedure TMainForm.FormCreate(Sender: TObject);
    var ListPair:TStringList; ListObject:TStringList;
          LStrRespContent:string;
        //:以上我加的
    //泛型异步任务:Rest调用数据、UI加载结果处理异常:FormCreate事前获取币种,保存到TStringList中:
    begin
      Async.Run<TStringList>(
        function: TStringList    //:异步任务:匿名线程执行函数:
        var
          LHTTP: THTTPClient;
          LResp: IHTTPResponse;

          LJObj: TJSONObject;
          LJRates: TJSONObject;
          I: Integer;
        begin
          LHTTP := THTTPClient.Create;

            //:步骤1:THTTPClient实例化
          try
            LResp := LHTTP.Get(
              'http://data.fixer.io/api/latest' //:baseURL:TURI的baseURL部分:包括Scheme(协议https://等)+Path(路径)+Port(端口)等
              +'?'  //:FQuery:TURI查询指令部分
              +'access_key='+ACCESS_KEY //:TURIParameters:TURI参数部分(TNameValuePair名称=数值的对,参数间用’&’分割)
                    //:在本例:access_key该参数相当于Token鉴权方式
            );

            //:步骤2:THTTPClient获取URL的默认头定义的响应接口IHTTPResponse

            LStrRespContent:=LResp.ContentAsString(TEncoding.UTF8);

            //:步骤3:响应接口IHTTPResponse以UTF8编码获取响应结果的内容字符串

            LStrRespContent:=TConverters.JsonReformat(LStrRespContent,true);
            //:步骤4:格式化获取到的响应结果的内容字符串为缩进的JSon格式化的字符串
              //:(便于阅读和调试)

            LJObj := TJSONObject.ParseJSONValue (LStrRespContent) as TJSONObject;

            //:步骤5:解析:获取到的响应结果的JSon格式化的字符串:为JSON对象:

            try
              LJRates := LJObj.GetValue<TJSONObject>('rates');
              ListPair := TStringList.Create;
              ListObject:=TStringList.Create;
                //:我加的
              Result := TStringList.Create;
              for I := 0 to LJRates.Count - 1 do
              begin
                //ListPair.Add( LJRates.Pairs[I].JsonString.Value +' : '
                  //+ LJRates.Pairs[I].JsonValue.ToString );
                ListObject.Add( LJRates.Pairs[I].JsonString.Value +'='
                  + LJRates.Pairs[I].JsonValue.ToString );
                ListPair.AddPair(LJRates.Pairs[I].JsonString.Value,
                  LJRates.Pairs[I].JsonValue.ToString,
                  ListObject );

                  //:我加的
                Result.Add(LJRates.Pairs[I].JsonString.Value);
              end;
              Result.Sort;//:成功回调值TStringList索引排序
            finally
              LJObj.Free;
            end;
          finally
            LHTTP.Free;

            //:步骤7:释放THTTPClient实例
          end;
        end,
        procedure(const Strings: TStringList)
        begin  //:异步任务:主线程加载数据:

            //:步骤6:UI加载解析后的数据:
          Memo3.Clear;
          Memo3.Lines.BeginUpdate;
          Memo3.Lines.Add(LStrRespContent);
            //:加载经过格式化的响应内容字符串
              //:HTTP客户端Rest请求的JSon对象值(各币种对欧元)

          Memo3.Lines.EndUpdate;
          cbSymbol.Items.Assign(Strings);//:下拉框赋值
          Memo1.Lines.Clear; Memo1.Lines.BeginUpdate;
          //Memo1.Lines.Add( (ListPair.Objects[0] as TStrings).Text );
          Memo1.Lines.Add( ListPair.Text );
          //Memo1.Lines.Add( ListObject.Text );
          Memo1.Lines.EndUpdate;
            //:加载各币种对欧元的实时汇率:
          Memo2.Lines.Clear; Memo2.Lines.BeginUpdate;
          Memo2.Lines.Add( LStrRespContent ); Memo2.Lines.EndUpdate;
           //:我加的
        end,
        procedure(const ExceptParallel:Exception)
        begin  //:异步任务:异常处理:
          if ExceptParallel.Message.Trim<>'' then
          begin
            ShowMessage('请求出错了');
          end;
        end

        );
    end;


*用delphi XE开发工具NetHTTP技术体系快速入手HTTPs编程所需掌握的知识

重要参数得搞清楚:

1、请求参数:
System.Net.HttpClient.THTTPRequest

2、响应参数:
System.Net.HttpClient.IHTTPResponse  = interface(IURLResponse)  
System.Net.URLClient. IURLResponse = interface(IInterface)

二、REST技术体系:

       REST.Client;  REST.Response.Adapter;   REST.HttpClient; REST.Types;

       REST.Json, REST.Json.Interceptors;   REST.BindSource;  REST.Utils; 

       REST.Authenticator.Basic;   REST.Authenticator.OAuth;

TRESTClient的底层是THTTPClient: 继承关系如下-> TRESTHTTP -> REST.Client-> THTTPClient.Create->  THTTPClient    ->   System.Net.HttpClient

DX原生的:仅取决于操作系统,操作系统升级后,部署及其代码不会受到任何影响;不受组件的版本影响;可方便地Rest

//:这一组Rest客户端组件只对返回Json数据有效,对流和Xml均无效:

强大,好用,简单!

优势:

1、REST.Json, REST.Json.Interceptors :体系中这套与Json的交互,既可用于客户端,也可用于服务器端

2、既能很好的支持TSession会话方式的基本鉴权,又能很好的支持AccessToken访问令牌方式或代码方式的高级鉴权,有专门的非可视化鉴权单元(REST.Authenticator.Basic和REST.Authenticator.OAuth)支持,需要自己写代码去实现

弱势:

如果网络异常或服务器程序未启动或服务器程序错误,异常,在处理异常方面麻烦一些,其异常类(ERequestError  :uses Rest.Types)功能比较简单!

C:\Program Files (x86)\Embarcadero\Studio\20.0\source\data\rest

    RESTClient1: TRESTClient;                    //uses REST.Client;
    RESTRequest1: TRESTRequest;           //uses REST.Client;
    RESTResponse1: TRESTResponse;     //uses REST.Client; 
    RESTResponseDataSetAdapter1: TRESTResponseDataSetAdapter;  /uses REST.Response.Adapter;

    REST.BindSource  //:Rest客户端数据绑定源
    REST.Utils  //:Rest客户端实用工具:
        //:URIEncode、ExtractURLSegmentNames、ExtractGetParams、
        //:RESTComponentIsDesigning、TRESTFindDefaultComponent 
    REST.Authenticator.Basic    //:Rest客户端基本鉴权单元:TSession会话方式
    REST.Authenticator.OAuth   //:Rest客户端高级鉴权单元:AccessToken访问令牌方式或代码方式

Rest体系的客户端架构方案:

uses

  ClientModuleUnit1, //:我的客户端数据模块
  Converters
    //:我的Json到Bson的互转类、TBytes到String的互转类、JSon重新格式化、JSon到delphi代码转化、JSon到TJsonWriter代码转化、JSon到TJsonBuilder代码转化
    //:Converters:搜索路径:D:\PulledupO2O\myPublic\RTL\RTLSamples\Json

  , AsyncTask //: 我的异步任务单元

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专讲冷知识

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值