开发DataSnap_REST服务器

上传人:pw****6 文档编号:173423367 上传时间:2022-12-10 格式:DOC 页数:14 大小:282.50KB
收藏 版权申诉 举报 下载
开发DataSnap_REST服务器_第1页
第1页 / 共14页
开发DataSnap_REST服务器_第2页
第2页 / 共14页
开发DataSnap_REST服务器_第3页
第3页 / 共14页
资源描述:

《开发DataSnap_REST服务器》由会员分享,可在线阅读,更多相关《开发DataSnap_REST服务器(14页珍藏版)》请在装配图网上搜索。

1、Delphi XE程序设计系列 2-开发DataSnap/REST服务器 在上次的文章中讨论了如何把传统的Delphi 主从架构应用程序逐渐转换为DataSnap JSON服务器,在本篇文章中让我们正式讨论如何使用Delphi XE开发DataSnap/REST服务器,因为这其中牵涉到非常多的技术,所以我们将花数篇的篇幅来讨论。现在就让我们从DataSnap/REST服务器开始。 开发DataSnap服务器Delphi XE版的DataSnap允许开发人员同时在DataSnap服务器中实作RESTful架构的服务器,如此一来DataSnap服务器不但能够在网络内 部做为多层的服务服务器,也能够

2、让网络外部的客户端使用REST的方式来存取服务。 要在Delphi XE中建立DataSnap/REST服务器,请点选Files|New菜单,在DataSnap Server选项中选择DataSnap Server图像,如下图所示:Delphi XE提供三种不同的服务器型态,分别是以VCL应用程序实作的服务器,实作为主控程序的服务器以及实作成Windows服务应用程序的服务器,开发人员可根据自己的需求选择建立适当的服务器型态,在本篇文章中让我们建立VCL应用程序型态的服务器:点选Next按钮之后DataSnap精灵会如下图询问需要支持的通讯协议,是否使用安全验证功能以及是否要预先建立范例服务方

3、法,让我们点选下方的Select All以选择建立所有的功能,如下图所示:点选Next按钮,DataSnap精灵会如下图询问TCP/IP和HTTP使用的通信埠,内定上TCP/IP使用211而HTTP则使用 8080,开发人员可根据自己的需求设定这两个通信埠,或是点选Find Open Port按钮让DataSnap精灵帮忙搜寻可使用的通信埠:接着DataSnap精灵会询问开发人员实作服务方法的类别,开发人员能够选择实作于TComponent类别,TDataModule类别或是TDSServerModule类别,在本文章中我们选择实作于TDSServerModule:点选Finish按钮之后,D

4、elphi XE便会建立相对应的项目,我们开启ServerContainerUnit的话就能够看到其中包含了如下组件,其中的 TDSServer,TDSTCPServerTransport以及TDSServerClass类别组件在Delphi 2010中就存有了,新的TDSHTTPService类别组件则提供了HTTP/HTTPS通讯协议的支持,而新的 TDSAuthenticationManager类别组件则提供安全验证功能,在稍后的文章中我们会说明如何使用它。现在DataSnap精灵会在项目的ServerMethodsUnit程序单元中产生两个范例方法,EchoString和Reverse

5、String。现在让我们在这个程序单元中加入一个新的服务方法取得部落格文章名称,如下所示:public Public declarations function EchoString(Value: string): string;function ReverseString(Value: string): string;function 取得部落格文章名称 : TJSONArray;接着实作取得部落格文章名称方法,如下所示:function TServerMethods2.取得部落格文章名称: TJSONArray;beginResult := TJSONArray.Create;Result

6、.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对象给客户

7、端。最后开启ServerMethodsUnit程序单元的设计接口,在其中放入dbExpress组件以存取储存在MS SQL Server数据库中的范例数据表FishFacts,稍后我们将说明这个DataSnap/REST服务器如何同时以传统DataSnap的架构让用户端使用dbExpress组件存取数据,以及如何以REST的架构让客户端存取它提供的服务。现在编译并且执行这个DataSnap/REST服务器。由于现在这个服务器同时可提供DataSnap和REST服务器的功能,因此现在我们可以试着使用浏览器来使用存取这个服务器的服务。让我们使用下面的URI来呼叫取得部落格文章名称方法:http:/

8、localhost:8085/datasnap/rest/TServerMethods2/取得部落格文章名称我们可以在下图中看到,我们果然可以在浏览器中使用上面的URI成功的呼叫服务器的服务:而且我们从上图中可以清楚的看到回传的结果是使用JSON格式封装的JSON数组,每一个数组元素是Unicode编码的JSON字符串。连结使用DataSnap服务器现在让我们建立一个客户端VCL应用程序项目,放入TSQLConnection组件,然后设定它的特性值如下(此时DataSnap/REST服务器必须是在执行状态):特性特性值DriverDatasnapConnectedTrue点选鼠标右键,选择建立

9、Generate DataSnap Client Classes菜单,如下所示,再把产生的程序单元储存为ServerProxy程序单元。然后在主窗体中放入如下的dbExpress和VCL组件:设定TDSProviderConnection组件的特性值如下:特性特性值SQLConnectionSQLConnection1ServerClassNameTServerMethods2再设定TClientDataSet的特性值如下:特性特性值RemoteServerDSProviderConnection1ProviderdspFishFacts当我们在设定TClientDataSet的Provide

10、r特性值时,客户端应用程序就会连结到DataSnap/REST服务器并且显示ServerMethodsUnit程序单元中输出的TDataSetProvider组件。让我们在更新按钮的OnClick事件处理函式中撰写如下的程序代码:procedure TForm10.Button3Click(Sender: TObject);beginif (cdsFishFacts.ChangeCount 0) thencdsFishFacts.ApplyUpdates(0);end;编译并且执行客户端应用程序,我们就可以看到类似如下的画面:DataSnap/REST服务器就如同以前的DataSnap/Mid

11、as服务器一样可以提供二层和多层的开发架构,客户端应用程序也可以使用dbExpress组件来异动DataSnap/REST服务器中的数据。现在我们已经展示了这个DataSnap/REST服务器可以同时使用二层/多层和REST的架构来使用它。现在再让我们看看如何在客户端使用程序代码来存取服务器的服务。在前面我们已经藉由TSQLConnection组件自动产生了ServerProxy程序单元,如果我们开启ServerProxy,便会看到下面的类别宣告:TServerMethods2Client = class(TDSAdminClient)privateFEchoStringCommand: TD

12、BXCommand;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

13、;function ReverseString(Value: string): string;function 取得部落格文章名称: TJSONArray;end;如果我们观察ServerProxy程序单元中的取得部落格文章名称方法,就可以看到它也使用dbExpress技术来存取服务器的服务:function TServerMethods2Client.取得部落格文章名称: TJSONArray;beginif F取得部落格文章名称Command = nil thenbeginF取得部落格文章名称Command := FDBXConnection.CreateCommand;F取得部落格文章名

14、称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程序单元中的取

15、得部落格文章名称方法来取得部落格文章信息: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(i

16、Index).ToString);finallyaServer.Free;end;end;下图是客户端应用程序执行上面程序代码的结果:但是除了dbExpress技术之外,我们也可以使用REST,JavaScript等技术来存取服务器服务,因为这个服务器就是一个REST服务器。因此让我们更深入的讨论一下如何在客户端自动产生程序代码来支持REST和JavaScript等技术。客户端程序代码产生器DataSnap XE版目前可自动产生四种客户端程序代码让不同的客户端能够连结和使用DataSnap/REST服务器,这四种是:DataSnap XE支持的四种客户端程序代码说明Delphi DBX使用db

17、Express技术呼叫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 : T

18、DBXStringArray;iIndex : Integer;beginsa := DSProxyWriter.TDSProxyWriterFactory.RegisteredWritersList;for iIndex := 0 to Length(sa) 1 doComboBox1.Items.Add(saiIndex);ComboBox1.ItemIndex := 0;end;DSProxyWriter程序单元中 TDSProxyWriterFactory类别的类别方法RegisteredWritersList可以回传目前注册的客户端程序代码种类,目前上表列出的四种客户端程序代码产生器

19、分别位于DSProxyDelphi,DSProxyCpp, DSProxyJavaScript和DSProxyDelphiRest程序单元中。当我们要产生上表四种客户端程序代码以呼叫特定的DataSnap/REST服务器时,我们需要使用IDSProxyMetaDataLoader接口以及TDSProxyGenerator类别。IDSProxyMetaDataLoader接口是由TDSProxyMetaDataLoader类别实作的,我们可以使用 TDBXConnection对象建立TDSProxyMetaDataLoader对象,取得它的IDSProxyMetaDataLoader接口, 再建

20、立TDSProxyGenerator对象,设定要产生的特定客户端程序代码目标,最后呼叫TDSProxyGenerator对象的Write方法, 如此一来DataSnap框架就会自动产生连结特定DataSnap/REST服务器的客户端程序代码。例如,现在让我们来看看如何能够要求DataSnap框架自动产生Delphi REST或是JavaScript的客户端程序代码。下面的程序代码首先呼叫GetMetaDataLoader方法取得IDSProxyMetaDataLoader接口,再呼叫GenerateFile藉由IDSProxyMetaDataLoader接口产生使用者特定的客户端程序代码:pr

21、ocedure TForm10.Button2Click(Sender: TObject);varLMetaDataLoader: IDSProxyMetaDataLoader;beginLMetaDataLoader := GetMetaDataLoader;GenerateFile(LMetaDataLoader);ShowGeneratedFiles;end;GetMetaDataLoader方法藉由程序中的 TSQLConnection的TDBXConnection对象建立TDSProxyMetaDataLoader对象,再回传 TDSProxyMetaDataLoader对象实作的I

22、DSProxyMetaDataLoader接口:function TForm10.GetMetaDataLoader : IDSProxyMetaDataLoader;beginResult := TDSProxyMetaDataLoader.Create(function: TDBXConnectionbeginOpenConnection;Result := SQLConnection1.DBXConnection;end,procedure(AConnection: TDBXConnection)beginSQLConnection1.Close;end);end;而GenerateFi

23、le方法先建立 TDSProxyGenerator对象,设定它的Writer特性值为稍后使用者在程序中设定的特定的客户端程序代码的名称,例如是Delphi DBX产生使用dbExpress技术的客户端程序代码,或是Java Script REST产生使用REST/JSON的JavaScript程序代码,最后呼叫Write方法实际的产生客户端程序代码:procedure TForm10.GenerateFile(AMetaDataLoader: IDSProxyMetaDataLoader);varLProxyGenerator: TDSProxyGenerator;beginLProxyGen

24、erator := TDSProxyGenerator.Create(nil);tryLProxyGenerator.Writer := ComboBox1.Text;LProxyGenerator.TargetUnitName := GeneratedServerProxy;LProxyGenerator.ExcludeMethods := ;LProxyGenerator.ExcludeClasses := ;LProxyGenerator.TargetDirectory := .;LProxyGenerator.OnCreatingFiles := ACreatingFiles;LPro

25、xyGenerator.OnCreatedFiles := ACreatedFiles;LProxyGenerator.Write(AMetaDataLoader);finallyLProxyGenerator.Free;end;end;现在如果我们执行客户端应用程序,可以看到如下的画面,在下面中我选择产生Delphi REST的客户端程序代码:那么这个范例客户端应用程序便会自动产生使用REST的客户端Delphi程序代码,例如它产生的呼叫范例DataSnap/REST服务器的取得部落格文章名称方法的程序代码如下:function TServerMethods2Client.取得部落格文章名称

26、(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.Execu

27、te(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.取得部落格文章名称 = fun

28、ction() var returnObject = this.executor.executeMethod(取得部落格文章名称, GET, , arguments0, true, arguments1, arguments2);if (arguments0 = null) if (returnObject != null & returnObject.result != null & isArray(returnObject.result) var resultArray = returnObject.result;var resultObject = new Object();result

29、Object.result = resultArray0;if (returnObject.cacheId != null & returnObject.cmdIndex != null) resultObject._cacheId = returnObject.cacheId;resultObject._cmdIndex = returnObject.cmdIndex;return resultObject;return returnObject;this.取得部落格文章名称_URL = function() return this.executor.getMethodURL(取得部落格文章

30、名称, GET, , arguments0)0;var JSProxyClassList = TServerMethods2: DSServerModuleCreate,DSServerModuleDestroy,EchoString,ReverseString,取得部落格文章名称;最后我试着同时使用Delphi客户端应用程序以及浏览器两个不同的客户端来呼叫和使用范例DataSnap/REST服务器,看起来一切都非常的美好:当然,我也可以使用纯粹的Web客户端应用程序来呼叫和使用范例DataSnap/REST服务器,例如下图就是我使用VCL For Web XI来使用范例DataSnap/REST服务器的结果,所有的服务仍然工作良好:DataSnap XE版藉由扩充多层架构到REST和JSON的技术领域,让DataSnap XE瞬间突破了平台的限制,允许Delphi,C/C+Builder,JavaScript,PHP,Ruby和移动设备等各种客户端能够使用它的服 务,再次赋予了DataSnap框架无限的发展潜能。好了,时间已晚,我们也下次再见了。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!