開發(fā)DataSnap_REST服務(wù)器_第1頁
開發(fā)DataSnap_REST服務(wù)器_第2頁
開發(fā)DataSnap_REST服務(wù)器_第3頁
開發(fā)DataSnap_REST服務(wù)器_第4頁
開發(fā)DataSnap_REST服務(wù)器_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Delphi XE程序設(shè)計系列 2-開發(fā)DataSnap/REST服務(wù)器 2012-12-28 14:50:23| 分類: 服務(wù)器 | 標簽: |舉報 |字號大中小 訂閱 在上次的文章中討論了如何把傳統(tǒng)的Delphi 主從架構(gòu)應(yīng)用程序逐漸轉(zhuǎn)換為DataSnap JSON服務(wù)器,在本篇文章中讓我們正式討論如何使用Delphi XE開發(fā)DataSnap/REST服務(wù)器,由于這其中牽涉到非常多的技術(shù),因此我們將花數(shù)篇的篇幅來討論?,F(xiàn)在就讓我們從DataSnap/REST服務(wù)器開始。 開發(fā)DataSnap服務(wù)器Delphi XE版的DataSnap允許開發(fā)人員同時在DataSnap服務(wù)器中實作REST

2、ful架構(gòu)的服務(wù)器,如此一來DataSnap服務(wù)器不但可以在網(wǎng)絡(luò)內(nèi) 部做為多層的服務(wù)服務(wù)器,也可以讓網(wǎng)絡(luò)外部的客戶端使用REST的方式來存取服務(wù)。 要在Delphi XE中建立DataSnap/REST服務(wù)器,請點選Files|New菜單,在DataSnap Server選項中選擇DataSnap Server圖像,如下圖所示:Delphi XE提供三種不同的服務(wù)器型態(tài),分別是以VCL應(yīng)用程序?qū)嵶鞯姆?wù)器,實作為主控程序的服務(wù)器以及實作成Windows服務(wù)應(yīng)用程序的服務(wù)器,開發(fā)人員可根據(jù)自己的需求選擇建立適當?shù)姆?wù)器型態(tài),在本篇文章中讓我們建立VCL應(yīng)用程序型態(tài)的服務(wù)器:點選Next按鈕之后D

3、ataSnap精靈會如下圖詢問需要支持的通訊協(xié)議,是否使用安全驗證功能以及是否要預(yù)先建立范例服務(wù)方法,讓我們點選下方的Select All以選擇建立所有的功能,如下圖所示:點選Next按鈕,DataSnap精靈會如下圖詢問TCP/IP和HTTP使用的通信埠,內(nèi)定上TCP/IP使用211而HTTP則使用 8080,開發(fā)人員可根據(jù)自己的需求設(shè)定這兩個通信埠,或是點選Find Open Port按鈕讓DataSnap精靈幫忙搜尋可使用的通信埠:接著DataSnap精靈會詢問開發(fā)人員實作服務(wù)方法的類別,開發(fā)人員可以選擇實作于TComponent類別,TDataModule類別或是TDSServerMo

4、dule類別,在本文章中我們選擇實作于TDSServerModule:點選Finish按鈕之后,Delphi XE便會建立相對應(yīng)的項目,我們開啟ServerContainerUnit的話就可以看到其中包含了如下組件,其中的 TDSServer,TDSTCPServerTransport以及TDSServerClass類別組件在Delphi 2010中就存在了,新的TDSHTTPService類別組件則提供了HTTP/HTTPS通訊協(xié)議的支持,而新的 TDSAuthenticationManager類別組件則提供安全驗證功能,在稍后的文章中我們會說明如何使用它?,F(xiàn)在DataSnap精靈會在項目的

5、ServerMethodsUnit程序單元中產(chǎn)生兩個范例方法,EchoString和ReverseString?,F(xiàn)在讓我們在這個程序單元中加入一個新的服務(wù)方法取得部落格文章名稱,如下所示: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程序設(shè)計系列 1-主從架構(gòu), 多層到JSON和REST);Result.AddElement(TJSONString.Create(從原生API到REST API 使用C+Builder XE開發(fā)REST應(yīng)用程序);Result.AddElement(TJSONString.Create(Delphi XE程序設(shè)計系列 2-DataSnap/REST服務(wù)器);end;取得部落格文章名稱方法建立TJSONArray對象,

7、并且把三篇文章名稱以TJSONString對象儲存在元素中,最后回傳TJSONArray對象給客戶端。最后開啟ServerMethodsUnit程序單元的設(shè)計接口,在其中放入dbExpress組件以存取儲存在MS SQL Server數(shù)據(jù)庫中的范例數(shù)據(jù)表FishFacts,稍后我們將說明這個DataSnap/REST服務(wù)器如何同時以傳統(tǒng)DataSnap的架構(gòu)讓用戶端使用dbExpress組件存取數(shù)據(jù),以及如何以REST的架構(gòu)讓客戶端存取它提供的服務(wù)?,F(xiàn)在編譯并且執(zhí)行這個DataSnap/REST服務(wù)器。由于現(xiàn)在這個服務(wù)器同時可提供DataSnap和REST服務(wù)器的功能,因此現(xiàn)在我們可以試著使用

8、瀏覽器來使用存取這個服務(wù)器的服務(wù)。讓我們使用下面的URI來呼叫取得部落格文章名稱方法:http:/localhost:8085/datasnap/rest/TServerMethods2/取得部落格文章名稱我們可以在下圖中看到,我們果然可以在瀏覽器中使用上面的URI成功的呼叫服務(wù)器的服務(wù):而且我們從上圖中可以清楚的看到回傳的結(jié)果是使用JSON格式封裝的JSON數(shù)組,每一個數(shù)組元素是Unicode編碼的JSON字符串。連結(jié)使用DataSnap服務(wù)器現(xiàn)在讓我們建立一個客戶端VCL應(yīng)用程序項目,放入TSQLConnection組件,然后設(shè)定它的特性值如下(此時DataSnap/REST服務(wù)器必須是在

9、執(zhí)行狀態(tài)):特性特性值DriverDatasnapConnectedTrue點選鼠標右鍵,選擇建立Generate DataSnap Client Classes菜單,如下所示,再把產(chǎn)生的程序單元儲存為ServerProxy程序單元。然后在主窗體中放入如下的dbExpress和VCL組件:設(shè)定TDSProviderConnection組件的特性值如下:特性特性值SQLConnectionSQLConnection1ServerClassNameTServerMethods2再設(shè)定TClientDataSet的特性值如下:特性特性值RemoteServerDSProviderConnection

10、1ProviderdspFishFacts當我們在設(shè)定TClientDataSet的Provider特性值時,客戶端應(yīng)用程序就會連結(jié)到DataSnap/REST服務(wù)器并且顯示ServerMethodsUnit程序單元中輸出的TDataSetProvider組件。讓我們在更新按鈕的OnClick事件處理函式中撰寫如下的程序代碼:procedure TForm10.Button3Click(Sender: TObject);beginif (cdsFishFacts.ChangeCount > 0) thencdsFishFacts.ApplyUpdates(0);end;編譯并且執(zhí)行客戶端

11、應(yīng)用程序,我們就可以看到類似如下的畫面:DataSnap/REST服務(wù)器就如同以前的DataSnap/Midas服務(wù)器一樣可以提供二層和多層的開發(fā)架構(gòu),客戶端應(yīng)用程序也可以使用dbExpress組件來異動DataSnap/REST服務(wù)器中的數(shù)據(jù)?,F(xiàn)在我們已經(jīng)展示了這個DataSnap/REST服務(wù)器可以同時使用二層/多層和REST的架構(gòu)來使用它?,F(xiàn)在再讓我們看看如何在客戶端使用程序代碼來存取服務(wù)器的服務(wù)。在前面我們已經(jīng)藉由TSQLConnection組件自動產(chǎn)生了ServerProxy程序單元,如果我們開啟ServerProxy,便會看到下面的類別宣告:TServerMethods2Clien

12、t = class(TDSAdminClient)privateFEchoStringCommand: TDBXCommand;FReverseStringCommand: TDBXCommand;F取得部落格文章名稱Command: TDBXCommand;publicconstructor Create(ADBXConnection: TDBXConnection); overload;constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload;destructor Destro

13、y; override;function EchoString(Value: string): string;function ReverseString(Value: string): string;function 取得部落格文章名稱: TJSONArray;end;如果我們觀察ServerProxy程序單元中的取得部落格文章名稱方法,就可以看到它也使用dbExpress技術(shù)來存取服務(wù)器的服務(wù):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(FInsta

15、nceOwner);end;因此在客戶端,我們可以使用下面的程序代碼藉由ServerProxy程序單元中的取得部落格文章名稱方法來取得部落格文章信息:procedure TForm10.Button1Click(Sender: TObject);varaServer: TServerMethods2Client;ja : TJSONArray;iIndex: Integer;beginaServer := TServerMethods2Client.Create(Self.SQLConnection1.DBXConnection);tryja := aServer.取得部落格文章名稱;for

16、iIndex := 0 to ja.Size 1 doListBox1.Items.Add(ja.Get(iIndex).ToString);finallyaServer.Free;end;end;下圖是客戶端應(yīng)用程序執(zhí)行上面程序代碼的結(jié)果:但是除了dbExpress技術(shù)之外,我們也可以使用REST,JavaScript等技術(shù)來存取服務(wù)器服務(wù),因為這個服務(wù)器就是一個REST服務(wù)器。因此讓我們更深入的討論一下如何在客戶端自動產(chǎn)生程序代碼來支持REST和JavaScript等技術(shù)。客戶端程序代碼產(chǎn)生器DataSnap XE版目前可自動產(chǎn)生四種客戶端程序代碼讓不同的客戶端能夠連結(jié)和使用DataSna

17、p/REST服務(wù)器,這四種是:DataSnap XE支持的四種客戶端程序代碼說明Delphi DBX使用dbExpress技術(shù)呼叫DataSnap/REST服務(wù)器的客戶端Delphi程序代碼C+Builder DBX使用dbExpress技術(shù)呼叫DataSnap/REST服務(wù)器的客戶端C/C+程序代碼Java Script REST使用REST/JSON技術(shù)呼叫DataSnap/REST服務(wù)器的客戶端JavaScript程序代碼Delphi REST使用REST/JSON技術(shù)呼叫DataSnap/REST服務(wù)器的客戶端Delphi程序代碼我們可以輕易的使用下面的程序代碼來取得目前能夠產(chǎn)生的客戶

18、端程序代碼: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類別的類別方法Regis

19、teredWritersList可以回傳目前注冊的客戶端程序代碼種類,目前上表列出的四種客戶端程序代碼產(chǎn)生器分別位于DSProxyDelphi,DSProxyCpp, DSProxyJavaScript和DSProxyDelphiRest程序單元中。當我們要產(chǎn)生上表四種客戶端程序代碼以呼叫特定的DataSnap/REST服務(wù)器時,我們需要使用IDSProxyMetaDataLoader接口以及TDSProxyGenerator類別。IDSProxyMetaDataLoader接口是由TDSProxyMetaDataLoader類別實作的,我們可以使用 TDBXConnection對象建立TDS

20、ProxyMetaDataLoader對象,取得它的IDSProxyMetaDataLoader接口, 再建立TDSProxyGenerator對象,設(shè)定要產(chǎn)生的特定客戶端程序代碼目標,最后呼叫TDSProxyGenerator對象的Write方法, 如此一來DataSnap框架就會自動產(chǎn)生連結(jié)特定DataSnap/REST服務(wù)器的客戶端程序代碼。例如,現(xiàn)在讓我們來看看如何能夠要求DataSnap框架自動產(chǎn)生Delphi REST或是JavaScript的客戶端程序代碼。下面的程序代碼首先呼叫GetMetaDataLoader方法取得IDSProxyMetaDataLoader接口,再呼叫Ge

21、nerateFile藉由IDSProxyMetaDataLoader接口產(chǎn)生使用者特定的客戶端程序代碼:procedure TForm10.Button2Click(Sender: TObject);varLMetaDataLoader: IDSProxyMetaDataLoader;beginLMetaDataLoader := GetMetaDataLoader;GenerateFile(LMetaDataLoader);ShowGeneratedFiles;end;GetMetaDataLoader方法藉由程序中的 TSQLConnection的TDBXConnection對象建立TDS

22、ProxyMetaDataLoader對象,再回傳 TDSProxyMetaDataLoader對象實作的IDSProxyMetaDataLoader接口:function TForm10.GetMetaDataLoader : IDSProxyMetaDataLoader;beginResult := TDSProxyMetaDataLoader.Create(function: TDBXConnectionbeginOpenConnection;Result := SQLConnection1.DBXConnection;end,procedure(AConnection: TDBXCon

23、nection)beginSQLConnection1.Close;end);end;而GenerateFile方法先建立 TDSProxyGenerator對象,設(shè)定它的Writer特性值為稍后使用者在程序中設(shè)定的特定的客戶端程序代碼的名稱,例如是Delphi DBX產(chǎn)生使用dbExpress技術(shù)的客戶端程序代碼,或是Java Script REST產(chǎn)生使用REST/JSON的JavaScript程序代碼,最后呼叫Write方法實際的產(chǎn)生客戶端程序代碼:procedure TForm10.GenerateFile(AMetaDataLoader: IDSProxyMetaDataLoader

24、);varLProxyGenerator: TDSProxyGenerator;beginLProxyGenerator := TDSProxyGenerator.Create(nil);tryLProxyGenerator.Writer := ComboBox1.Text;LProxyGenerator.TargetUnitName := GeneratedServerProxy;LProxyGenerator.ExcludeMethods := ;LProxyGenerator.ExcludeClasses := ;LProxyGenerator.TargetDirectory := .;

25、LProxyGenerator.OnCreatingFiles := ACreatingFiles;LProxyGenerator.OnCreatedFiles := ACreatedFiles;LProxyGenerator.Write(AMetaDataLoader);finallyLProxyGenerator.Free;end;end;現(xiàn)在如果我們執(zhí)行客戶端應(yīng)用程序,可以看到如下的畫面,在下面中我選擇產(chǎn)生Delphi REST的客戶端程序代碼:那么這個范例客戶端應(yīng)用程序便會自動產(chǎn)生使用REST的客戶端Delphi程序代碼,例如它產(chǎn)生的呼叫范例DataSnap/REST服務(wù)器的取得部落格

26、文章名稱方法的程序代碼如下: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(

27、TServerMethods2_取得部落格文章名稱);end;F取得部落格文章名稱Command.Execute(ARequestFilter);Result := TJSONArray(F取得部落格文章名稱Command.Parameters0.Value.GetJSONValue(FInstanceOwner);end;看到現(xiàn)在它是使用HTTP的Get命令,藉由REST呼叫慣例來呼叫DataSnap/REST服務(wù)器的取得部落格文章名稱方法了。如果我是選擇產(chǎn)生Java Script REST,那么下面就是DataSnap框架自動產(chǎn)生的客戶端JavaScript程序代碼:/* return result Type on server: TJSONArray*/this.取得部落格文章名稱 = function() var returnObject = this.executor.executeMethod(取得部落格文章名稱, GET, , arguments0, true, arguments1, arguments2);if (arguments0 = null) if (returnObject != null && returnObject.result != null && isArray(returnObject.r

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論