公開 Web 服務(wù):WSDL
在線銀行服務(wù)由幾種操作構(gòu)成,在實(shí)現(xiàn)這些操作之前,我們將首先介紹一下各操作。您將了解到各操作的細(xì)節(jié)、消息、端口類型和 WSDL 綁定。
之前已經(jīng)看到了 在線銀行 Web 服務(wù)的概述。現(xiàn)在將了解構(gòu)建此 Web 服務(wù)所需的操作:
Login
- 登錄允許您通過(guò) Web 服務(wù)驗(yàn)證您的憑證,并獲取一個(gè)令牌(token),證明您已通過(guò)驗(yàn)證,可進(jìn)一步進(jìn)行 Web 服務(wù)請(qǐng)求。
- 傳遞兩段數(shù)據(jù)(用戶名和密碼),返回一段數(shù)據(jù)(二進(jìn)制令牌)。
Logout
- 注銷操作將從 Web 服務(wù)的經(jīng)過(guò)身份驗(yàn)證的令牌/用戶名列表中刪除您的令牌和用戶名。
- 注銷僅需您發(fā)送令牌,隨后會(huì)返回一個(gè)確定布爾變量作為響應(yīng)。
LookupAccounts
- 查找您的賬戶信息。
- 僅需令牌,返回賬戶號(hào)、類型和余額列表。
LookupTransactions
- 按日期查找交易。
- 發(fā)送令牌和賬戶號(hào),以及可選日期范圍(日期 1 和日期 2),回發(fā)一個(gè)交易復(fù)型數(shù)組作為響應(yīng)(
minOccurs="0" maxOccurs="unbounded"
)。
SearchTransactions
- 按支票號(hào)或金額查找交易。
- 允許更為復(fù)雜的交易搜索:傳遞賬戶號(hào)、令牌,以及支票號(hào)范圍或金額范圍,隨后會(huì)返回一個(gè)滿足條件的交易復(fù)型數(shù)組作為響應(yīng)。
TransferFunds
- 將資金從一個(gè)賬戶劃撥到另外一個(gè)賬戶中。
- 劃撥資金操作要求您發(fā)送令牌、源賬戶、目標(biāo)賬戶號(hào)和金額。回發(fā)一個(gè)確認(rèn)布爾變量作為響應(yīng)。
LookupPayees
- 查看與您的在線賬戶相關(guān)的收款方。
- 發(fā)送令牌,您將接收一個(gè)作為響應(yīng)的收款方別名數(shù)組。
AddPayee
- 向您的在線賬戶添加收款方。
- 發(fā)送令牌和收款方復(fù)型,然后發(fā)送一個(gè)布爾確認(rèn)信息作為響應(yīng)。
EditPayee
- 與
AddPayee
基本完全相同,惟一的差異就是更新收款方而非將其插入基礎(chǔ)數(shù)據(jù)庫(kù)。
ViewPayee
- 查看您的賬戶中與一個(gè)收款方相關(guān)的所有信息。
- 發(fā)送令牌和收款方別名,檢索收款方復(fù)型作為響應(yīng)。
MakeBillPayment
- 支付與一個(gè)收款方相關(guān)的一份賬單。
- 發(fā)送
BillPayment
復(fù)型和令牌,回發(fā)一個(gè)確認(rèn)布爾變量作為響應(yīng)。
ChangeBillPayment
- 更改事先安排好的支付。
- 與
MakeBillPayment
基本相同,惟一的差異就是更新支付而非將其插入基本數(shù)據(jù)庫(kù)。
LookupPendingPayments
- 查看所有待定支付。
- 僅發(fā)送令牌,您將接收一個(gè)
BillPayment
復(fù)型數(shù)組作為響應(yīng)。
SubmitLoanApplication
- 提交一份貸款申請(qǐng)表。
- 發(fā)送
LoanApplication
復(fù)型和令牌,回發(fā)一個(gè)確認(rèn)布爾變量作為響應(yīng)。
ViewLoanApplicationStatus
- 查看與您的在線賬戶相關(guān)的所有貸款狀態(tài)。
- 僅發(fā)送令牌,您將接收一個(gè)
LoanApplicationStatus
復(fù)型數(shù)組。
上邊給出了全部定義。切記,有極多的操作要定義,并且不能過(guò)于繁冗或令人感到厭煩。因此,如果您遇到麻煩,可參考本教程后文 下載 一節(jié)中給出的 WSDL 文件,將其與上述操作比較。但下面我們會(huì)從始至終地詳細(xì)介紹部分操作,作為示例供您參考,您可通過(guò)這些示例掌握如何處理其他操作。
接下來(lái)將定義 WSDL 文件的名稱空間。
![]() ![]() |
![]()
|
盡管最初看上去有些古怪,但您的 WSDL 文件的名稱空間相當(dāng)重要,因?yàn)樗鼈兌x了整個(gè) WSDL 中各標(biāo)記(tag)的上下文。將以下代碼放在已添加到 OnlineBanking.wsdl 文件中的數(shù)據(jù)結(jié)構(gòu)之前,如 清單 7 所示。
清單 7. 設(shè)置 WSDL
|
xsd1:
名稱空間指定 <xsd:schema
標(biāo)記中定義的所有結(jié)構(gòu)都屬于 xsd1:
名稱空間 (http://www.example.com/OnlineBanking/xsd
),且需要據(jù)其引用,與 清單 6 中所引用的 RecurringBillPayment
復(fù)型類似。tns
或 targetNamespace
表示頂級(jí) WSDL (http://www.example.com/OnlineBanking
) 中定義的所有消息。接下來(lái)將為請(qǐng)求和響應(yīng)定義元素標(biāo)記。
![]() ![]() |
![]()
|
本節(jié)的剩余內(nèi)容將引領(lǐng)您為 Login
和 LookupTransactions
操作創(chuàng)建 WSDL。請(qǐng)求為發(fā)送至 Web 服務(wù)的 SOAP 對(duì)象,可包含不同的內(nèi)部層次結(jié)構(gòu),如前文中創(chuàng)建的數(shù)據(jù)結(jié)構(gòu)。在 RecurringBillPayment
復(fù)型之后定義登錄請(qǐng)求,如 清單 8 所示。
清單 8. 登錄請(qǐng)求
|
本元素中恰好發(fā)送了一個(gè)用戶名和密碼。就是這樣。接著定義查找交易元素,如 清單 9 所示。
清單 9. 查找交易請(qǐng)求
|
這里有一個(gè)接受 accountNumber
和 token
(base64Binary
類型)的查找交易請(qǐng)求。在后文中您將看到 base64Binary
類型在 Java 編程語(yǔ)言中轉(zhuǎn)換為 byte[]
。下面定義響應(yīng)。
![]() ![]() |
![]()
|
客戶機(jī)創(chuàng)建并發(fā)送請(qǐng)求。Web 服務(wù)接收請(qǐng)求并根據(jù)請(qǐng)求創(chuàng)建響應(yīng)。定義登錄響應(yīng),如 清單 10 所示。
清單 10. 登錄響應(yīng)
|
登錄成功響應(yīng)給出有效變量的 true
值及令牌變量中的二進(jìn)制令牌。再看看查找交易響應(yīng)。按 清單 11 定義該響應(yīng)。
清單 11. 查找交易響應(yīng)
|
該響應(yīng)返回一個(gè)交易元素?cái)?shù)組。注意此處使用的 xsd1:
名稱空間。您只需直接為數(shù)組類型引用 清單 1 中定義的 Transaction
復(fù)型即可。接下來(lái)介紹消息。
![]() ![]() |
![]()
|
消息將發(fā)送給 Web 服務(wù)并返回,這些消息包括 SOAP 請(qǐng)求之前您在 響應(yīng) 一節(jié)中定義的響應(yīng)。定義 Login
請(qǐng)求和響應(yīng)消息,如 清單 12 所示。
清單 12. 登錄請(qǐng)求和響應(yīng)消息
|
在消息內(nèi)放置哪些內(nèi)容作為 <wsdl:part
標(biāo)記的名稱屬性無(wú)關(guān)緊要,要注意的項(xiàng)目已用黑體表示。登錄請(qǐng)求消息引用之前定義的 Login
元素,同樣,LoginResponse
響應(yīng)消息引用之前定義的 LoginResponse
元素。下面定義查找交易請(qǐng)求與響應(yīng)消息,如 清單 13 所示。
清單 13. 查找交易請(qǐng)求與響應(yīng)消息
|
現(xiàn)在您應(yīng)注意到了繁冗重復(fù)。就像登錄請(qǐng)求與響應(yīng)那樣,您要命名查找交易請(qǐng)求和響應(yīng),引用之前定義的相關(guān)查找交易請(qǐng)求和響應(yīng)元素。其他請(qǐng)求與響應(yīng)也遵循同一模板。下面為您的在線銀行 Web 服務(wù)定義端口類型。
![]() ![]() |
![]()
|
端口類型指定特定 Web 服務(wù)的操作。我們將定義端口類型和兩個(gè)登錄與查找交易操作。按 清單 14 定義端口類型和登錄操作。
清單 14. 端口類型和登錄操作
|
首先命名端口類型,在指定 WSDL 綁定時(shí)需要用到它。Login
和 LoginResponse
的 tns:
前綴指定應(yīng)在 tns
名稱空間中查找消息,參見 清單 15 中的定義。現(xiàn)在定義查找交易操作。
清單 15. 查找交易操作
|
再一次地,就像 Login
操作那樣,定義 LookupTransactions
操作與之非常類似。接下來(lái)介紹 WSDL 綁定。
![]() ![]() |
![]()
|
WSDL 綁定指定消息格式、Web 服務(wù)的協(xié)議類型、在該端口上公開的操作。定義 WSDL 綁定和登錄操作特有的綁定,如 清單 16 所示。
清單 16. WSDL 登錄操作綁定
|
首先,命名綁定。現(xiàn)在注意類型。它引用了您在 清單 14 中定義的端口類型。<soap:binding
標(biāo)記指定 Web 服務(wù)的傳輸方法和方式,分別為 http 和文檔。<soap:body
指定輸入和輸出消息的編碼方式。這里采用文字編碼。接著定義查找交易操作的 WSDL 綁定,如 清單 17 所示。
清單 17. 查找交易操作的 WSDL 綁定
|
這又一次與登錄操作具有相似之處。其他操作也遵循這一模板。接下來(lái)繼續(xù)介紹 WSDL 的最后一部分內(nèi)容:服務(wù)標(biāo)記。
![]() ![]() |
![]()
|
服務(wù)標(biāo)記定義此 Web 服務(wù)公開了哪些端口。按 清單 18 進(jìn)行服務(wù)定義。
清單 18. 服務(wù)定義
|
首先命名服務(wù),隨后定義一個(gè)公開的端口 OnlineBankingPort
,該端口引用您在 清單 17 中所定義的 WSDL 綁定。地址用于指定 Geronimo 上查找 Web 服務(wù)的 URL,也是收發(fā) SOAP 請(qǐng)求的 URL。
下一節(jié)將 WSDL 編譯為 Java 代碼并在 Geronimo 上進(jìn)行部署。
![]() ![]() |
![]()
|
編譯與部署 Web 服務(wù)
現(xiàn)在開始創(chuàng)建 Java 代碼,它將實(shí)現(xiàn)在 WSDL 中定義的 Web 服務(wù)并使用 Axis2 在 Geronimo 上進(jìn)行部署。
為創(chuàng)建 Web 服務(wù)的 Java 實(shí)現(xiàn),請(qǐng)?jiān)谀?WSDL 文件上運(yùn)行 WSDL2Java 工具。為此,鍵入以下代碼(在 Microsoft? Windows? 中):
<axis2-binary-install-dir>/bin/WSDL2Java -d xmlbeans -uri ask.wsdl
-p com.ibm.axis2.onlinebanking -ss -sd
或(在 Linux? 中):
sh <axis2-binary-install-dir>/bin/WSDL2Java.sh -d xmlbeans
-uri ask.wsdl -p com.ibm.axis2.onlinebanking -sd
現(xiàn)在鍵入以下代碼以創(chuàng)建用于測(cè)試的客戶機(jī)存根(在 Windows 中):
<axis2-binary-install-dir>/bin/WSDL2Java -d xmlbeans -uri ask.wsdl
-p com.ibm.axis2.onlinebanking -ss -sd
或(在 Linux 中):
sh <axis2-binary-install-dir>/bin/WSDL2Java.sh -d xmlbeans
-uri ask.wsdl -p com.ibm.axis2.onlinebanking -sd
就是這樣!現(xiàn)在 ./src 目錄下應(yīng)已創(chuàng)建好了 Java 源文件。方便的 Apache Ant build.xml 文件也會(huì)創(chuàng)建在此目錄中。現(xiàn)在填充基本 Web 服務(wù)框架。
![]() ![]() |
![]()
|
為避免在測(cè)試 Web 服務(wù)時(shí)出現(xiàn)嚴(yán)重錯(cuò)誤,需要在填充 Web 服務(wù)框架時(shí)使其永遠(yuǎn)不會(huì)返回 null
。查看 ./src/com/ibm/axis2/onlinebanking/OnlineBankingPortTypeSkeleton.java 這一 Web 服務(wù)框架。打開并仔細(xì)觀察該框架。您應(yīng)注意到其中某處的 Login
方法,如 清單 19 所示。
清單 19. 原始 Web 服務(wù)
|
注意返回類型為 LoginResponseDocument
,方法的參數(shù)為 LoginDocument
(請(qǐng)求)。通過(guò)返回一個(gè)空的 LoginResponseDocument
填充示例定義,如 清單 20 所示。
清單 20. 示例定義
|
在第一行中,從 param8
中獲得實(shí)際 Login
請(qǐng)求對(duì)象(Axis2 在您的系統(tǒng)中生成的名稱可能與此不同)。接下來(lái)在第三行中創(chuàng)建一個(gè)新的 LoginResponseDocument
,添加新的 LoginResponse
,返回空 res
對(duì)象 —— LoginResponseDocument
。
另外,不要忘記在頂端的包聲明之下輸入以下 import
語(yǔ)句:
package com.ibm.axis2.onlinebanking;
import com.example.www.onlinebanking.xsd.*;
...
這樣在構(gòu)建和部署 Web 服務(wù)時(shí)就不會(huì)遇到 class not found
錯(cuò)誤了。
![]() ![]() |
![]()
|
在 Geronimo 上部署 Axis2 和 Web 服務(wù)
首先,您需要構(gòu)建 Web 服務(wù)。進(jìn)入運(yùn)行 WSDL2Java 工具的目錄下,鍵入:
ant jar.server
這將創(chuàng)建一個(gè) OnlineBankingService.aar 文件,路徑為 ./build/lib/OnlineBankingService.aar。啟動(dòng) Geronimo,部署此 Web 服務(wù) Axis2 歸檔文件。鍵入以下命令引導(dǎo) Apache Geronimo:
java -jar <geronimo-install-dir>/bin/server.jar
您已通過(guò)將 axis2.war 文件復(fù)制到 <geronimo-install-dir>/deploy 中而從 Apache 處下載了此文件,下面來(lái)部署此文件。打開瀏覽器,轉(zhuǎn)到 http://localhost:8080/axis2/Login.jsp。
以用戶名 admin、密碼 axis2 登錄。將您的瀏覽器轉(zhuǎn)到 http://localhost:8080/axis2/upload.jsp。
單擊 Browse,找到 OnlineBankingService.aar 文件,然后單擊 Upload。在 20 到 30 秒內(nèi)即可準(zhǔn)備好 Web 服務(wù)。同時(shí),下一節(jié)將為您介紹如何創(chuàng)建一個(gè)簡(jiǎn)單的客戶機(jī),以測(cè)試 Web 服務(wù)的初始功能。
![]() ![]() |
![]()
|
創(chuàng)建和測(cè)試簡(jiǎn)單的客戶機(jī)
為測(cè)試您的 Web 服務(wù),應(yīng)定義一個(gè)簡(jiǎn)單的客戶機(jī)對(duì)其進(jìn)行徹底的測(cè)試,確保正確傳輸 SOAP 消息。
創(chuàng)建客戶機(jī)的第一步是導(dǎo)入類依賴性。創(chuàng)建 Client.java 文件,路徑為 ./src/Client.java。按 清單 21 定義此文件。
清單 21. 導(dǎo)入類依賴性
|
您將使用的絕大多數(shù)對(duì)象都在前兩個(gè)導(dǎo)入語(yǔ)句中,特別是客戶機(jī)存根,還有請(qǐng)求與響應(yīng)對(duì)象,以及 數(shù)據(jù)結(jié)構(gòu) 一節(jié)中所定義的其他數(shù)據(jù)結(jié)構(gòu)。下面開始定義主函數(shù),首先聲明客戶機(jī)存根。
客戶機(jī)存根使您可處理現(xiàn)運(yùn)行于 Geronimo 之上的 Web 服務(wù)。按 清單 22 創(chuàng)建客戶機(jī)存根。
清單 22. 客戶機(jī)存根
|
將 Web 服務(wù)的 URL 傳遞給 OnlineBankingPortTypeStub
對(duì)象即可輕松完成對(duì)象的初始化。下面創(chuàng)建一些在調(diào)用和測(cè)試 Web 服務(wù)時(shí)使用的初始函數(shù)。
![]() ![]() |
![]()
|
本節(jié)內(nèi)容也存在著重復(fù)的現(xiàn)象,因此這里只為您介紹在 Web 服務(wù)中調(diào)用 Login
和 LookupTransactions
操作的 API。掌握這種模板和 清單 25 中定義的函數(shù)調(diào)用后,即可輕松處理其余部分。首先定義調(diào)用 Login
操作的方法,如 清單 23 所示。
清單 23. 調(diào)用 Login 操作
|
在這里,我們輕松地創(chuàng)建了一個(gè)空的 LoginDocument
請(qǐng)求、將其發(fā)送給 Web 服務(wù),然后接收一個(gè)空對(duì)象。如果一切順利,則不會(huì)出現(xiàn)任何錯(cuò)誤。清單 24 顯示了定義 LookupTransactions
操作的原理示例。
清單 24. 調(diào)用 LookupTransactions 操作
|
為其他所有操作創(chuàng)建類似的模板,這樣您就可以對(duì)它們進(jìn)行測(cè)試,為順利學(xué)習(xí)本系列教程的第 2 部分作好準(zhǔn)備。接下來(lái)一次性測(cè)試所有 Web 服務(wù)操作,調(diào)用方法(參見 清單 25)。
清單 25. 一次性測(cè)試所有 Web 服務(wù)操作
|
調(diào)用各方法,傳入存根,這樣就作好了準(zhǔn)備,可以構(gòu)建并運(yùn)行客戶機(jī)了。
![]() ![]() |
![]()
|
構(gòu)建客戶機(jī),測(cè)試 Web 服務(wù)
您應(yīng)該希望再次構(gòu)建 Web 服務(wù)。像之前一樣,鍵入以下命令來(lái)構(gòu)建它:
ant jar.server
要運(yùn)行客戶機(jī),向 build.xml 文件中添加一個(gè)新的 Ant 任務(wù),如 清單 26 所示。
清單 26. 添加新 Ant 任務(wù)以運(yùn)行客戶機(jī)
|
這樣就創(chuàng)建好了一個(gè)運(yùn)行客戶機(jī)的新任務(wù),鍵入以下命令即可運(yùn)行客戶機(jī):
ant run.client
您應(yīng)看到運(yùn)行客戶機(jī)的控制臺(tái)輸出,如 圖 1 所示。
圖 1. 運(yùn)行客戶機(jī)

服務(wù)器控制臺(tái)輸出(也就是運(yùn)行 Geronimo 的控制臺(tái))應(yīng)如 圖 2 所示。
圖 2. 服務(wù)器輸出

此時(shí),您或許會(huì)注意到,首次運(yùn)行客戶機(jī)要花費(fèi)很長(zhǎng)時(shí)間,這是因?yàn)?Web 服務(wù)需要在您的機(jī)器上加載并緩存自己。此后再運(yùn)行客戶機(jī)會(huì)快很多,您會(huì)注意到明顯的速度提高。
至此,一切都很好!Web 服務(wù)正常運(yùn)轉(zhuǎn)了!
![]() ![]() |
![]()
|