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 //: 我的异步任务单元

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

被折叠的 条评论
为什么被折叠?



