




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Delphi XE程序设计系列 2-开发DataSnap/REST服务器 2012-12-28 14:50:23| 分类: 服务器 | 标签: |举报 |字号大中小 订阅 在上次的文章中讨论了如何把传统的Delphi 主从架构应用程序逐渐转换为DataSnap JSON服务器,在本篇文章中让我们正式讨论如何使用Delphi XE开发DataSnap/REST服务器,由于这其中牵涉到非常多的技术,因此我们将花数篇的篇幅来讨论。现在就让我们从DataSnap/REST服务器开始。 开发DataSnap服务器Delphi XE版的DataSnap允许开发人员同时在DataSnap服务器中实作RESTful架构的服务器,如此一来DataSnap服务器不但可以在网络内 部做为多层的服务服务器,也可以让网络外部的客户端使用REST的方式来存取服务。 要在Delphi XE中建立DataSnap/REST服务器,请点选Files|New菜单,在DataSnap Server选项中选择DataSnap Server图像,如下图所示:Delphi XE提供三种不同的服务器型态,分别是以VCL应用程序实作的服务器,实作为主控程序的服务器以及实作成Windows服务应用程序的服务器,开发人员可根据自己的需求选择建立适当的服务器型态,在本篇文章中让我们建立VCL应用程序型态的服务器:点选Next按钮之后DataSnap精灵会如下图询问需要支持的通讯协议,是否使用安全验证功能以及是否要预先建立范例服务方法,让我们点选下方的Select All以选择建立所有的功能,如下图所示:点选Next按钮,DataSnap精灵会如下图询问TCP/IP和HTTP使用的通信埠,内定上TCP/IP使用211而HTTP则使用 8080,开发人员可根据自己的需求设定这两个通信埠,或是点选Find Open Port按钮让DataSnap精灵帮忙搜寻可使用的通信埠:接着DataSnap精灵会询问开发人员实作服务方法的类别,开发人员可以选择实作于TComponent类别,TDataModule类别或是TDSServerModule类别,在本文章中我们选择实作于TDSServerModule:点选Finish按钮之后,Delphi XE便会建立相对应的项目,我们开启ServerContainerUnit的话就可以看到其中包含了如下组件,其中的 TDSServer,TDSTCPServerTransport以及TDSServerClass类别组件在Delphi 2010中就存在了,新的TDSHTTPService类别组件则提供了HTTP/HTTPS通讯协议的支持,而新的 TDSAuthenticationManager类别组件则提供安全验证功能,在稍后的文章中我们会说明如何使用它。现在DataSnap精灵会在项目的ServerMethodsUnit程序单元中产生两个范例方法,EchoString和ReverseString。现在让我们在这个程序单元中加入一个新的服务方法取得部落格文章名称,如下所示:public Public declarations function EchoString(Value: string): string;function ReverseString(Value: string): string;function 取得部落格文章名称 : TJSONArray;接着实作取得部落格文章名称方法,如下所示:function TServerMethods2.取得部落格文章名称: TJSONArray;beginResult := TJSONArray.Create;Result.AddElement(TJSONString.Create(Delphi XE程序设计系列 1-主从架构, 多层到JSON和REST);Result.AddElement(TJSONString.Create(从原生API到REST API 使用C+Builder XE开发REST应用程序);Result.AddElement(TJSONString.Create(Delphi XE程序设计系列 2-DataSnap/REST服务器);end;取得部落格文章名称方法建立TJSONArray对象,并且把三篇文章名称以TJSONString对象储存在元素中,最后回传TJSONArray对象给客户端。最后开启ServerMethodsUnit程序单元的设计接口,在其中放入dbExpress组件以存取储存在MS SQL Server数据库中的范例数据表FishFacts,稍后我们将说明这个DataSnap/REST服务器如何同时以传统DataSnap的架构让用户端使用dbExpress组件存取数据,以及如何以REST的架构让客户端存取它提供的服务。现在编译并且执行这个DataSnap/REST服务器。由于现在这个服务器同时可提供DataSnap和REST服务器的功能,因此现在我们可以试着使用浏览器来使用存取这个服务器的服务。让我们使用下面的URI来呼叫取得部落格文章名称方法:http:/localhost:8085/datasnap/rest/TServerMethods2/取得部落格文章名称我们可以在下图中看到,我们果然可以在浏览器中使用上面的URI成功的呼叫服务器的服务:而且我们从上图中可以清楚的看到回传的结果是使用JSON格式封装的JSON数组,每一个数组元素是Unicode编码的JSON字符串。连结使用DataSnap服务器现在让我们建立一个客户端VCL应用程序项目,放入TSQLConnection组件,然后设定它的特性值如下(此时DataSnap/REST服务器必须是在执行状态):特性特性值DriverDatasnapConnectedTrue点选鼠标右键,选择建立Generate DataSnap Client Classes菜单,如下所示,再把产生的程序单元储存为ServerProxy程序单元。然后在主窗体中放入如下的dbExpress和VCL组件:设定TDSProviderConnection组件的特性值如下:特性特性值SQLConnectionSQLConnection1ServerClassNameTServerMethods2再设定TClientDataSet的特性值如下:特性特性值RemoteServerDSProviderConnection1ProviderdspFishFacts当我们在设定TClientDataSet的Provider特性值时,客户端应用程序就会连结到DataSnap/REST服务器并且显示ServerMethodsUnit程序单元中输出的TDataSetProvider组件。让我们在更新按钮的OnClick事件处理函式中撰写如下的程序代码:procedure TForm10.Button3Click(Sender: TObject);beginif (cdsFishFacts.ChangeCount 0) thencdsFishFacts.ApplyUpdates(0);end;编译并且执行客户端应用程序,我们就可以看到类似如下的画面:DataSnap/REST服务器就如同以前的DataSnap/Midas服务器一样可以提供二层和多层的开发架构,客户端应用程序也可以使用dbExpress组件来异动DataSnap/REST服务器中的数据。现在我们已经展示了这个DataSnap/REST服务器可以同时使用二层/多层和REST的架构来使用它。现在再让我们看看如何在客户端使用程序代码来存取服务器的服务。在前面我们已经藉由TSQLConnection组件自动产生了ServerProxy程序单元,如果我们开启ServerProxy,便会看到下面的类别宣告:TServerMethods2Client = class(TDSAdminClient)privateFEchoStringCommand: TDBXCommand;FReverseStringCommand: TDBXCommand;F取得部落格文章名称Command: TDBXCommand;publicconstructor Create(ADBXConnection: TDBXConnection); overload;constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload;destructor Destroy; override;function EchoString(Value: string): string;function ReverseString(Value: string): string;function 取得部落格文章名称: TJSONArray;end;如果我们观察ServerProxy程序单元中的取得部落格文章名称方法,就可以看到它也使用dbExpress技术来存取服务器的服务:function TServerMethods2Client.取得部落格文章名称: TJSONArray;beginif F取得部落格文章名称Command = nil thenbeginF取得部落格文章名称Command := FDBXConnection.CreateCommand;F取得部落格文章名称Command.CommandType := TDBXCommandTypes.DSServerMethod;F取得部落格文章名称Command.Text := TServerMethods2.取得部落格文章名称;F取得部落格文章名称Command.Prepare;end;F取得部落格文章名称Command.ExecuteUpdate;Result := TJSONArray(F取得部落格文章名称Command.Parameters0.Value.GetJSONValue(FInstanceOwner);end;因此在客户端,我们可以使用下面的程序代码藉由ServerProxy程序单元中的取得部落格文章名称方法来取得部落格文章信息:procedure TForm10.Button1Click(Sender: TObject);varaServer: TServerMethods2Client;ja : TJSONArray;iIndex: Integer;beginaServer := TServerMethods2Client.Create(Self.SQLConnection1.DBXConnection);tryja := aServer.取得部落格文章名称;for iIndex := 0 to ja.Size 1 doListBox1.Items.Add(ja.Get(iIndex).ToString);finallyaServer.Free;end;end;下图是客户端应用程序执行上面程序代码的结果:但是除了dbExpress技术之外,我们也可以使用REST,JavaScript等技术来存取服务器服务,因为这个服务器就是一个REST服务器。因此让我们更深入的讨论一下如何在客户端自动产生程序代码来支持REST和JavaScript等技术。客户端程序代码产生器DataSnap XE版目前可自动产生四种客户端程序代码让不同的客户端能够连结和使用DataSnap/REST服务器,这四种是:DataSnap XE支持的四种客户端程序代码说明Delphi DBX使用dbExpress技术呼叫DataSnap/REST服务器的客户端Delphi程序代码C+Builder DBX使用dbExpress技术呼叫DataSnap/REST服务器的客户端C/C+程序代码Java Script REST使用REST/JSON技术呼叫DataSnap/REST服务器的客户端JavaScript程序代码Delphi REST使用REST/JSON技术呼叫DataSnap/REST服务器的客户端Delphi程序代码我们可以轻易的使用下面的程序代码来取得目前能够产生的客户端程序代码:procedure TForm10.ListRegisteredWriter;varsa : TDBXStringArray;iIndex : Integer;beginsa := DSProxyWriter.TDSProxyWriterFactory.RegisteredWritersList;for iIndex := 0 to Length(sa) 1 doComboBox1.Items.Add(saiIndex);ComboBox1.ItemIndex := 0;end;DSProxyWriter程序单元中 TDSProxyWriterFactory类别的类别方法RegisteredWritersList可以回传目前注册的客户端程序代码种类,目前上表列出的四种客户端程序代码产生器分别位于DSProxyDelphi,DSProxyCpp, DSProxyJavaScript和DSProxyDelphiRest程序单元中。当我们要产生上表四种客户端程序代码以呼叫特定的DataSnap/REST服务器时,我们需要使用IDSProxyMetaDataLoader接口以及TDSProxyGenerator类别。IDSProxyMetaDataLoader接口是由TDSProxyMetaDataLoader类别实作的,我们可以使用 TDBXConnection对象建立TDSProxyMetaDataLoader对象,取得它的IDSProxyMetaDataLoader接口, 再建立TDSProxyGenerator对象,设定要产生的特定客户端程序代码目标,最后呼叫TDSProxyGenerator对象的Write方法, 如此一来DataSnap框架就会自动产生连结特定DataSnap/REST服务器的客户端程序代码。例如,现在让我们来看看如何能够要求DataSnap框架自动产生Delphi REST或是JavaScript的客户端程序代码。下面的程序代码首先呼叫GetMetaDataLoader方法取得IDSProxyMetaDataLoader接口,再呼叫GenerateFile藉由IDSProxyMetaDataLoader接口产生使用者特定的客户端程序代码:procedure TForm10.Button2Click(Sender: TObject);varLMetaDataLoader: IDSProxyMetaDataLoader;beginLMetaDataLoader := GetMetaDataLoader;GenerateFile(LMetaDataLoader);ShowGeneratedFiles;end;GetMetaDataLoader方法藉由程序中的 TSQLConnection的TDBXConnection对象建立TDSProxyMetaDataLoader对象,再回传 TDSProxyMetaDataLoader对象实作的IDSProxyMetaDataLoader接口:function TForm10.GetMetaDataLoader : IDSProxyMetaDataLoader;beginResult := TDSProxyMetaDataLoader.Create(function: TDBXConnectionbeginOpenConnection;Result := SQLConnection1.DBXConnection;end,procedure(AConnection: TDBXConnection)beginSQLConnection1.Close;end);end;而GenerateFile方法先建立 TDSProxyGenerator对象,设定它的Writer特性值为稍后使用者在程序中设定的特定的客户端程序代码的名称,例如是Delphi DBX产生使用dbExpress技术的客户端程序代码,或是Java Script REST产生使用REST/JSON的JavaScript程序代码,最后呼叫Write方法实际的产生客户端程序代码:procedure TForm10.GenerateFile(AMetaDataLoader: IDSProxyMetaDataLoader);varLProxyGenerator: TDSProxyGenerator;beginLProxyGenerator := TDSProxyGenerator.Create(nil);tryLProxyGenerator.Writer := ComboBox1.Text;LProxyGenerator.TargetUnitName := GeneratedServerProxy;LProxyGenerator.ExcludeMethods := ;LProxyGenerator.ExcludeClasses := ;LProxyGenerator.TargetDirectory := .;LProxyGenerator.OnCreatingFiles := ACreatingFiles;LProxyGenerator.OnCreatedFiles := ACreatedFiles;LProxyGenerator.Write(AMetaDataLoader);finallyLProxyGenerator.Free;end;end;现在如果我们执行客户端应用程序,可以看到如下的画面,在下面中我选择产生Delphi REST的客户端程序代码:那么这个范例客户端应用程序便会自动产生使用REST的客户端Delphi程序代码,例如它产生的呼叫范例DataSnap/REST服务器的取得部落格文章名称方法的程序代码如下:function TServerMethods2Client.取得部落格文章名称(const ARequestFilter: string): TJSONArray;beginif F取得部落格文章名称Command = nil thenbeginF取得部落格文章名称Command := FConnection.CreateCommand;F取得部落格文章名称Command.RequestType := GET;F取得部落格文章名称Command.Text := TServerMethods2.取得部落格文章名称;F取得部落格文章名称Command.Prepare(TServerMethods2_取得部落格文章名称);end;F取得部落格文章名称Command.Execute(ARequestFilter);Result := TJSONArray(F取得部落格文章名称Command.Parameters0.Value.GetJSONValue(FInstanceOwner);end;看到现在它是使用HTTP的Get命令,藉由REST呼叫惯例来呼叫DataSnap/REST服务器的取得部落格文章名称方法了。如果我是选择产生Java Script REST,那么下面就是DataSnap框架自动产生的客户端JavaScript程序代码:/* return result Type on server: TJSONArray*/this.取得部落格文章名称 = function() var returnObject = this.executor.executeMethod(取得部落格文章名称, GET, , arguments0, true, arguments1, arguments2);if (arguments0 = null) if (returnObject !=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025河南许昌市建安区招聘公益性岗位人员13人模拟试卷及完整答案详解1套
- 2025广西百色市第三人民医院(百色市应急医院)公开招聘5人考前自测高频考点模拟试题附答案详解(考试直接用)
- 2025年宁波市鄞州区面向社会公开招聘社区专职工作者55人模拟试卷及一套答案详解
- 2025平煤集团国际贸易公司面向集团内部招聘1人笔试题库历年考点版附带答案详解
- 2025年枣庄市立医院公开招聘备案制工作人员(36人)考前自测高频考点模拟试题参考答案详解
- 2025湖南新宁县招聘教师30人模拟试卷及答案详解1套
- 2025昆明市官渡区司法局辅助人员招聘(1人)考前自测高频考点模拟试题带答案详解
- 2025江西吉安市青原区青鸾文化传媒有限公司招聘5人模拟试卷及答案详解(夺冠)
- 2025安徽皖岳信合项目管理有限公司招聘9人笔试题库历年考点版附带答案详解
- 2025河南许昌市消防救援支队招聘政府专职队员50人考前自测高频考点模拟试题及答案详解(易错题)
- 2025-2026学年道德与法治八年级上册第四单元维护国家利益综合素质测评卷(含答案)
- 5s考试试题及答案
- 白酒分销商合同协议书
- 卫星通信技术的前沿发展及其在物联网中的应用-洞察阐释
- 《医学中心肺癌诊疗》(讲课课件)
- 物流公司法人代表个人简介范文
- 规模灵活资源广域接入的新型配电系统分层分群架构与规划技术研究
- 2025年恒丰银行烟台分行招聘笔试参考题库含答案解析
- 中外建筑史课件
- 2024年度商业保理合同:保理公司与出口商之间的商业保理协议3篇
- 宣传网络安全文明上网
评论
0/150
提交评论