使用delphi已經10多年了,一直搞桌面程序開發,對Webservice一直很陌生,近來因工作需要,學習delphi開發WebService,擔心遺忘,作此筆記。 特別感謝 中塑在線技術總監 大犇
(2017.5.24編輯,添加數據庫訪問示例XE7)
一、delphi開發WebService
1、打開delphi,選擇New--other--WebService,在右側選擇 SOAP Server Application,點擊OK
2、上一步點擊OK后,會出現一個提示窗口,這里選擇ISAPI 動態鏈接庫,點擊OK進入下一步
3、此時會提示一個確認窗口,詢問是否為SOAP模塊創建接口,這樣要選擇YES,delphi會為您自動創建一個接口,否則自己動手寫會很麻煩
4、點擊YES后,delphi會提示你輸入 接口服務名稱,這個名稱在后面就是接口名和實現此接口的類名,這里我們鍵入MyTest,其他選項不要動,點擊 OK
5、點OK后,delphi會自動創建兩個單元,一個是MyTestIntf接口單元,一個是MyTestImpl接口實現單元
6、在MyTestIntf接口單元里面,接口聲明后面寫入你的接口函數,這個函數就是后面給別人調用實現一定功能的函數。
注意:函數聲明后面一定要加上stdcall約束參數傳入方式,否則其他語言可能無法調用此接口函數
7、切換到MyTestImpl接口實現單元,發現delphi已經為我們創建好了接口實現類TMyTest,在類的聲明里面寫上剛才的接口函數。當然也可以寫入其他函數供你的接口函數內部調用,這里我重新構造了類的Create函數及析構函數
8、保存項目,編譯生成DLL文件,此時delphi編寫WebService 就完成了,如此簡單
9、2017年5月24日編輯,添加數據庫訪問功能示例(Delphi XE7下)
a、切換到webmodule單元,添加幾個控件用於訪問后台數據庫。連接數據庫,將各個組建關聯起來,在query中添加sql代碼,查詢一些數據。
b、在類TWebModule1的public域添加一個方法GetXMLData,並實現該方法返回ClientDataset的XML數據(將query1查詢到的數據通過ClientDataset轉換為XML)
c、在接口單元添加一個方法,和上面第6步操作一樣
d、在接口函數實現單元引用WebModuleUnit1單元,實現GetXMLData方法。在這里將TWebModule1類實例化,調用其訪問數據庫的方法
e、新建一個VCL項目,添加一個按鈕和一個memo,在button click事件添加代碼,調用接口函數
f、運行效果
注:
特別說明,在這個例子中,我將數據訪問單元TWebModule類的GetXMLData方法和接口函數的GetXMLData方法弄重名了,這樣容易混淆。外部客戶端調用GetXMLData方法是接口的方法,不是后台數據庫訪問單元TWebModule的GetXMLData方法,此方法由TEchoTest類的對象在后台調用。
順序應該是這樣的:客戶端通過http地址獲取接口IEchoTest,后台WebService實例化類TEchoTest,客戶端調用接口函數GetXMLData,此方法在TEchoTest類中被實現(TEchoTest類GetXMLData方法),在此方法中實例化TWebModule類,並調用其GetXMLData方法返回數據。
二、delphi調試WebService
1、打開IIS,新建網站,至於如何建立網站就不說了,給網站起名,選擇物理路徑等,把剛才編譯好的DLL文件放入網站的物理目錄里面
2、將新建的網站目錄瀏覽打開
3、在網站的功能選項頁,選擇可執行程序映射,選擇剛才的DLL文件,並在請求限制里面選擇[執行],這個DLL就是IIS要調用執行的DLL
4、選擇 應用程序池,把里面的 32位兼容打開(我這個版本編譯出來的是32位的)和托管管道模式選擇為 Classic
5、在瀏覽器中鍵入網址 http://127.0.0.1:你的網站端口,回車打開網站,此時瀏覽器會轉到你的網站物理目錄下,顯示出里面的所有文件,其中有一個就是我們需要的DLL
6、點擊那個DLL文件,會出現下面這個界面
7、點擊WSDL,會出現如下界面。這是一個XML文檔,描述WSDL的細節,瀏覽器地址欄中的地址是我們需要的,復制下來
8、返回delphi,新建一個VCL項目。接着選擇New--other--WebService,選擇WSDL importer,點擊OK
9、出現一個提示窗口,鍵入第7步得到的WSDL網址,如果WebService不在本機,注意IP地址要修改
10、點擊NEXT ---NEXT--OK,delphi會自動引入一個單元,這個單元就是WebService的接口單元,里面會自動生成一個Get開頭方法,用來獲取接口。
在VCL單元引用這個單元,聲明一個變量,變量的類型就是接口名稱
var obj:IMyTest,
obj:= getXXXXX();
obj.HelloWord('哈哈哈');
至此delphi編寫WebService及調用結束。
注:第7步得到的WSDL地址很重要,如果點擊WSDL出現不了XML文檔,說明有問題,這個WSDL地址是不可用的,很可能的原因是網站沒配置好。