《开发DataSnap_REST服务器》由会员分享,可在线阅读,更多相关《开发DataSnap_REST服务器(14页珍藏版)》请在金锄头文库上搜索。
1、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服务器中实作REST
2、ful架构的服务器,如此一来DataSnap服务器不但可以在网络内 部做为多层的服务服务器,也可以让网络外部的客户端使用REST的方式来存取服务。 要在Delphi XE中建立DataSnap/REST服务器,请点选Files|New菜单,在DataSnap Server选项中选择DataSnap Server图像,如下图所示:Delphi XE提供三种不同的服务器型态,分别是以VCL应用程序实作的服务器,实作为主控程序的服务器以及实作成Windows服务应用程序的服务器,开发人员可根据自己的需求选择建立适当的服务器型态,在本篇文章中让我们建立VCL应用程序型态的服务器:点选Next按钮之后D
3、ataSnap精灵会如下图询问需要支持的通讯协议,是否使用安全验证功能以及是否要预先建立范例服务方法,让我们点选下方的Select All以选择建立所有的功能,如下图所示:点选Next按钮,DataSnap精灵会如下图询问TCP/IP和HTTP使用的通信埠,内定上TCP/IP使用211而HTTP则使用 8080,开发人员可根据自己的需求设定这两个通信埠,或是点选Find Open Port按钮让DataSnap精灵帮忙搜寻可使用的通信埠:接着DataSnap精灵会询问开发人员实作服务方法的类别,开发人员可以选择实作于TComponent类别,TDataModule类别或是TDSServerMo
4、dule类别,在本文章中我们选择实作于TDSServerModule:点选Finish按钮之后,Delphi XE便会建立相对应的项目,我们开启ServerContainerUnit的话就可以看到其中包含了如下组件,其中的 TDSServer,TDSTCPServerTransport以及TDSServerClass类别组件在Delphi 2010中就存在了,新的TDSHTTPService类别组件则提供了HTTP/HTTPS通讯协议的支持,而新的 TDSAuthenticationManager类别组件则提供安全验证功能,在稍后的文章中我们会说明如何使用它。现在DataSnap精灵会在项目的
5、ServerMethodsUnit程序单元中产生两个范例方法,EchoString和ReverseString。现在让我们在这个程序单元中加入一个新的服务方法取得部落格文章名称,如下所示:public Public declarations function EchoString(Value: string): string;function ReverseString(Value: string): string;function 取得部落格文章名称 : TJSONArray;接着实作取得部落格文章名称方法,如下所示:function TServerMethods2.取得部落格文章名称: T
6、JSONArray;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对象,
7、并且把三篇文章名称以TJSONString对象储存在元素中,最后回传TJSONArray对象给客户端。最后开启ServerMethodsUnit程序单元的设计接口,在其中放入dbExpress组件以存取储存在MS SQL Server数据库中的范例数据表FishFacts,稍后我们将说明这个DataSnap/REST服务器如何同时以传统DataSnap的架构让用户端使用dbExpress组件存取数据,以及如何以REST的架构让客户端存取它提供的服务。现在编译并且执行这个DataSnap/REST服务器。由于现在这个服务器同时可提供DataSnap和REST服务器的功能,因此现在我们可以试着使用
8、浏览器来使用存取这个服务器的服务。让我们使用下面的URI来呼叫取得部落格文章名称方法:http:/localhost:8085/datasnap/rest/TServerMethods2/取得部落格文章名称我们可以在下图中看到,我们果然可以在浏览器中使用上面的URI成功的呼叫服务器的服务:而且我们从上图中可以清楚的看到回传的结果是使用JSON格式封装的JSON数组,每一个数组元素是Unicode编码的JSON字符串。连结使用DataSnap服务器现在让我们建立一个客户端VCL应用程序项目,放入TSQLConnection组件,然后设定它的特性值如下(此时DataSnap/REST服务器必须是在
9、执行状态):特性特性值DriverDatasnapConnectedTrue点选鼠标右键,选择建立Generate DataSnap Client Classes菜单,如下所示,再把产生的程序单元储存为ServerProxy程序单元。然后在主窗体中放入如下的dbExpress和VCL组件:设定TDSProviderConnection组件的特性值如下:特性特性值SQLConnectionSQLConnection1ServerClassNameTServerMethods2再设定TClientDataSet的特性值如下:特性特性值RemoteServerDSProviderConnection
10、1ProviderdspFishFacts当我们在设定TClientDataSet的Provider特性值时,客户端应用程序就会连结到DataSnap/REST服务器并且显示ServerMethodsUnit程序单元中输出的TDataSetProvider组件。让我们在更新按钮的OnClick事件处理函式中撰写如下的程序代码:procedure TForm10.Button3Click(Sender: TObject);beginif (cdsFishFacts.ChangeCount 0) thencdsFishFacts.ApplyUpdates(0);end;编译并且执行客户端应用程序,
11、我们就可以看到类似如下的画面:DataSnap/REST服务器就如同以前的DataSnap/Midas服务器一样可以提供二层和多层的开发架构,客户端应用程序也可以使用dbExpress组件来异动DataSnap/REST服务器中的数据。现在我们已经展示了这个DataSnap/REST服务器可以同时使用二层/多层和REST的架构来使用它。现在再让我们看看如何在客户端使用程序代码来存取服务器的服务。在前面我们已经藉由TSQLConnection组件自动产生了ServerProxy程序单元,如果我们开启ServerProxy,便会看到下面的类别宣告:TServerMethods2Client = c
12、lass(TDSAdminClient)privateFEchoStringCommand: TDBXCommand;FReverseStringCommand: TDBXCommand;F取得部落格文章名称Command: TDBXCommand;publicconstructor Create(ADBXConnection: TDBXConnection); overload;constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload;destructor Destroy; ov
13、erride;function EchoString(Value: string): string;function ReverseString(Value: string): string;function 取得部落格文章名称: TJSONArray;end;如果我们观察ServerProxy程序单元中的取得部落格文章名称方法,就可以看到它也使用dbExpress技术来存取服务器的服务:function TServerMethods2Client.取得部落格文章名称: TJSONArray;beginif F取得部落格文章名称Command = nil thenbeginF取得部落格文章名称
14、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(FInstanceOw
15、ner);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服务器。因此让我们