監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢(xún)管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶(hù)案例 | 在線試用
X 關(guān)閉

Web服務(wù)內(nèi)幕,第3部分:Apache和Microsoft -- 良好的合作

申請(qǐng)免費(fèi)試用、咨詢(xún)電話(huà):400-8352-114

AMTeam.org

Web服務(wù)內(nèi)幕,第3部分:Apache和Microsoft -- 良好的合作

-- SOAP 互操作性就將來(lái)臨


James Snell (
jasnell@us.ibm.com)

軟件工程師,Emerging Technologies,IBM

2001 年 5 月

在“Web 服務(wù)內(nèi)幕”的這個(gè)部分中,James Snell 通過(guò)演示使用 Microsoft SOAP 工具包 Beta 2 獲得 Apache 基于 SOAP 的 Web 服務(wù)是如此的輕松,表明 Apache 和 Microsoft 可以很好地合作。

Web 服務(wù)的概念終于開(kāi)始為人們所接受。但當(dāng)您嘗試著去實(shí)現(xiàn)它時(shí),重要的是不要忘記,無(wú)論是開(kāi)發(fā)平臺(tái)還是編程語(yǔ)言,無(wú)縫跨平臺(tái)互操作性是這項(xiàng)技術(shù)的推動(dòng)力。如果您不把互操作性的問(wèn)題確定下來(lái),各種 SOAP 和 Web 服務(wù)實(shí)現(xiàn)都將在進(jìn)行信息傳遞的時(shí)候遇到故障。Web 服務(wù)則會(huì)成為又一個(gè)失敗的試驗(yàn)。

IBM、Microsoft 和 Apache

許多人可能都知道,去年春天 IBM 和 Microsoft 都發(fā)行了實(shí)現(xiàn) SOAP 的第一批版本。(后來(lái) IBM 把它的代碼給了 Apache,啟動(dòng)了現(xiàn)在的 Apache SOAP 項(xiàng)目計(jì)劃。)但是,盡管市場(chǎng)上所有有關(guān) SOAP 的著作都承諾其平臺(tái)互操作性,但工具卻并不能提供這一點(diǎn)。在 SOAP 實(shí)現(xiàn)方式中有很多錯(cuò)誤和細(xì)微差別,使得兩種工具間幾乎不能傳遞信息。但情況正開(kāi)始改變。由于 Apache SOAP 項(xiàng)目和 Microsoft 兩方面成員所作的一致努力,互操作性已成為一個(gè)中心議題。很多最初的問(wèn)題已經(jīng)消失,遺留的少數(shù)不兼容問(wèn)題也正被快速而順利地解決。

請(qǐng)注意:為了試驗(yàn)這里的兩個(gè)示例,您需要下載最新版 Apache SOAP (2.1 版) 和 Microsoft SOAP 工具包 (Beta 2 或以上)。請(qǐng)參閱參考資料。

互操作性 -- xsi:type 屬性的問(wèn)題

如果閱讀過(guò) developerWorks 上其他討論 Web 服務(wù)體系結(jié)構(gòu)的文章,那么您一定很熟悉以下的示意圖及其代表的含義。(如您沒(méi)有閱讀過(guò)這些文章,我強(qiáng)烈建議您上圖書(shū)館看一看。)

圖 1: Web 服務(wù)體系結(jié)構(gòu)的基本組件


圖 1 代表 Web 服務(wù)體系結(jié)構(gòu)的三個(gè)基本組件所執(zhí)行的三個(gè)基本操作:

服務(wù)提供者通過(guò)在服務(wù)代理者那里注冊(cè)來(lái)配置和發(fā)布服務(wù);

服務(wù)請(qǐng)求者通過(guò)查找服務(wù)代理者那里的被發(fā)布服務(wù)登記記錄來(lái)找到服務(wù);

服務(wù)請(qǐng)求者綁定服務(wù)提供者并使用可用的服務(wù)。

在 Web 服務(wù)的世界里,三個(gè)操作都包含三個(gè)受到稱(chēng)贊的、和截然不同的技術(shù):

發(fā)布的服務(wù)使用“通用描述、發(fā)現(xiàn)和集成(UDDI) API”;

查找服務(wù)使用 UDDI 和 Web 服務(wù)描述語(yǔ)言的組合(WSDL);

綁定服務(wù)處理 WSDL 和簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(SOAP)。

從最基礎(chǔ)的層次上來(lái)看,綁定操作是三者中最重要的。它包含服務(wù)的實(shí)際使用,這也是發(fā)生大多數(shù)互操作性問(wèn)題的地方。簡(jiǎn)單地說(shuō),是服務(wù)提供者和服務(wù)請(qǐng)求者對(duì) SOAP 規(guī)范的全力支持解決了這些問(wèn)題,并實(shí)現(xiàn)了無(wú)縫互操作性。

不幸的是,這個(gè)簡(jiǎn)單的解決方案聽(tīng)起來(lái)容易實(shí)現(xiàn),但實(shí)際上卻難得多。SOAP 的許多可選組件形成的靈活性、及其固有的綜合單一性使得我們?cè)趪L試實(shí)現(xiàn)它時(shí)會(huì)受到挫折。舉個(gè)例子,Microsoft 和 Apache SOAP 工具包間產(chǎn)生的 xsi:type 屬性沖突是個(gè)惱人的小問(wèn)題,它可以導(dǎo)致一段時(shí)間內(nèi)工具間互操作性的完全中斷。

不要忘記,根據(jù) SOAP 規(guī)范,一個(gè)信封中包含的各個(gè)元素可能選擇性地使用 xsi:type 屬性來(lái)識(shí)別其包含的數(shù)據(jù)類(lèi)型。如果服務(wù)提供者和請(qǐng)求者有一些其它方式來(lái)傳遞此信息,則它不必被包含在信封中。 xsi:type 只有當(dāng)無(wú)其它方式傳遞這些數(shù)據(jù)類(lèi)型時(shí),才應(yīng)使用這個(gè)屬性。

為了解決這一問(wèn)題,Microsoft 建立了一個(gè)外部服務(wù)描述文檔的相關(guān)性,它描述了數(shù)據(jù)類(lèi)型,且能被服務(wù)提供者和請(qǐng)求者訪問(wèn)。Apache 要求任何時(shí)候都要包含 xsi:type 屬性。

這兩種方法都是“合法 SOAP”(盡管 Apache 采取的實(shí)現(xiàn)方法被認(rèn)為更合法和更固定一些),但是它們彼此不兼容。附帶補(bǔ)充一句,Apache SOAP 沒(méi)有而且是依然沒(méi)有理解 Microsoft 采用的服務(wù)描述語(yǔ)言。這種語(yǔ)言已有過(guò)三次反復(fù)。首先是“服務(wù)描述語(yǔ)言”或 SDL,其次是“服務(wù)合同語(yǔ)言”或 SCL,再次是現(xiàn)在的 “Web 服務(wù)描述語(yǔ)言”或 WSDL。

同時(shí) Microsoft 也沒(méi)有包含任何機(jī)制能方便地把 xsi:type 屬性添加到工具生成的 SOAP 信封上。不過(guò)好在情況已有所改變。Microsoft 現(xiàn)在有一個(gè)新的十分靈活的 SOAP 實(shí)現(xiàn)方式,它包含對(duì) SOAP 信封更好的支持和更低級(jí)別的控制。而 Apache 也已解除需要存在 xsi:type 屬性的限制。這樣,兩個(gè)工具間就能互相自由傳遞信息了。

一個(gè)擴(kuò)展的股票行情服務(wù),版本 1

我們這里的示例將為免費(fèi)的 NASDAQ InfoQuotes 服務(wù)創(chuàng)建一個(gè)基于 SOAP 的界面,請(qǐng)參閱
http://quotes.nasdaq.com。這個(gè)簡(jiǎn)單的服務(wù)通過(guò) HTTP-GET 請(qǐng)求,以 HTML 或 XML 格式提供擴(kuò)展的股票行情服務(wù)。所有這個(gè)項(xiàng)目的 Java 和 XML 源文件在參考資料部分。圖 2 的屏幕截圖顯示行情服務(wù)返回的 XML 數(shù)據(jù)。

圖 2:Nasdaq 行情的 XML 數(shù)據(jù)的屏幕截圖


在 NasdaqQuotes Web 服務(wù)的版一上,我們將使用一個(gè)簡(jiǎn)單的 Java 類(lèi),它表達(dá)了一個(gè)單獨(dú) getQuotes 方法;將 HTTP-GET 請(qǐng)求的 XML 輸出作為一個(gè)字符串返回,如清單 1 的代碼片段所示。

配置這個(gè) Web 服務(wù)

要將這個(gè) Java 類(lèi)配置成一個(gè) Web 服務(wù),應(yīng)該編譯它并確定它在您的 Java Web 服務(wù)器的類(lèi)的路徑上(假設(shè)您已安裝和配置了 Apache SOAP 2.1)。以下幾步將告訴您如何從 Microsoft SOAP 上配置和調(diào)用服務(wù)。

步驟 1. 創(chuàng)建一個(gè) Apache 配置描述符。Apache SOAP Service Manager 利用配置描述符(一個(gè)簡(jiǎn)單的 XML 文檔)收集有關(guān)已配置服務(wù)的信息。請(qǐng)參閱清單 2 中的 NasdaqQuotes 服務(wù)版本 1.0 的配置描述符。

清單 2: 一個(gè) XML 配置描述符

id="urn:NasdaqQuotes">
scope="Application"
methods="getQuote">

org.apache.soap.server.DOMFaultListener


xmlns:x="" qname="x:symbol"
xml2JavaClassName="org.apache.soap.encoding.soapenc.StringDeserializer"/>

Apache SOAP 文檔中有 XML 配置描述符的詳細(xì)結(jié)構(gòu)說(shuō)明。但是請(qǐng)注意我們例子中的 部分,它從 Apache SOAP 上去掉了 xsi:type 限制。在此,我們已經(jīng)聲明 XML 元素 symbol 映射到 StringDeserializer 類(lèi)。這個(gè)類(lèi)把 XML 元素的內(nèi)容轉(zhuǎn)換成一個(gè) java.lang.String 的實(shí)例。通過(guò)使用這種顯式映射,Apache SOAP 無(wú)需為了提供映射信息而去尋找 xsi:type。而且,可以假定所有 XML symbol 元素的實(shí)例都可看成 String,并進(jìn)行那樣的串并轉(zhuǎn)換。

步驟 2. 一旦已創(chuàng)建配置描述符,您得用它將 NasdaqQuotes 服務(wù)配置在服務(wù)的注冊(cè)記錄中。通過(guò)執(zhí)行此命令行可以完成配置。

這里 http://acme.com/soap/servlet/rpcrouter 對(duì)應(yīng)您的 SOAP RPC Router Servlet 安裝。NasdaqQuotes 服務(wù)完成配置,并可以使用了。您可以通過(guò)調(diào)用本文附帶的 zip 包中所提供的基于 java 的客戶(hù)端來(lái)測(cè)試此服務(wù)。請(qǐng)參閱 readme.txt 的指導(dǎo)。

步驟 3. Microsoft 工具需要使用一個(gè) WSDL 文檔,它描述服務(wù)的界面和位置。既然 Apache SOAP 不包含對(duì) WSDL 的任何支持,您就有兩種選擇:用 IBM 的 alphaWorks 的 WSDL 工具包來(lái)為指定的 Java 類(lèi)生成 WSDL,或者自己編寫(xiě) WSDL 文件。我建議您手寫(xiě) WSDL (請(qǐng)參閱清單 3 ) -- 把東西寫(xiě)出來(lái)會(huì)讓您對(duì) WSDL 的結(jié)構(gòu)和功能有更好的感覺(jué)。如果您需要出色的 XML 編輯器,我大力推薦商用的 XML-Spy 產(chǎn)品,但是其他編輯器也能用。

在編輯完 NasdaqQuotes.wsdl 文件后,該使用 Microsoft 工具了。在這篇文章所帶的 zip 包中,您會(huì)發(fā)現(xiàn) samp1e 目錄里有兩個(gè)名為 nq.vbs 和 vq.bat 的文件。 nq.vbs (請(qǐng)參閱清單 4 )文件包含使用 Microsoft SOAP 工具包調(diào)用 NasdaqQuotes 服務(wù)的代碼,腳本有 43 行代碼,但實(shí)際 SOAP 調(diào)用的發(fā)生只有前六行(它們中的四行由初始化基本變量的代碼組成)。您看,Microsoft 下了很大功夫使人們方便地使用他們的工具。

清單 4: 針對(duì) Microsoft SOAP 工具包的 nq.vbs

Set SC = CreateObject("MSSOAP.SoapClient")
SC.mssoapinit "D:ServicesNasdaqQuotesClient.wsdl", "", "", ""
Res = SC.getQuote(WScript.Arguments(0))

通過(guò)執(zhí)行 nq.bat 文件,您可調(diào)用 NasdaqQuotes 服務(wù),把您要查詢(xún)的代號(hào)作為一個(gè)命令行參數(shù)來(lái)傳入(請(qǐng)參閱圖 3)。

圖 3: 從命令行運(yùn)行 NasdaqQuotes


家庭作業(yè): NasdaqQuotes 版本 2

NasdaqQuotes 服務(wù)版本 1.0 非常簡(jiǎn)潔地顯示了 Microsoft 和 Apache 有能力互相進(jìn)行便捷的信息傳遞。但是行情服務(wù)返回的信息是以字符串的形式返回的,這意味著還需更多努力來(lái)改善服務(wù)。例如:我們可能要求 SOAP 信封實(shí)體以 XML 形式來(lái)返回查詢(xún)結(jié)果,而不是以返回字符串的形式。在 zip 下載包中的 NasdaqQuotes2 Service 示例能讓您采取正確的步驟。您的家庭作業(yè)是仔細(xì)研究這個(gè)例子里的內(nèi)容。和平常一樣,如您有任何問(wèn)題,請(qǐng)告訴我,看看我是否能幫助您。

參考資料

請(qǐng)點(diǎn)擊文章頂部或底部的討論,參與有關(guān)這篇文章的討論論壇。

針對(duì)本文中的項(xiàng)目的 Java 和 XML 源代碼在這個(gè) zip 文件中。

請(qǐng)下載最新版的 Apache SOAP。

請(qǐng)下載最新版的 Microsoft SOAP 工具包。

請(qǐng)查看 SOAP 參考資料的 cetus-links 索引。

如同 Web 服務(wù)資源中心和開(kāi)發(fā)顧問(wèn),Lemur Labs 也有一個(gè)附帶參考資料的 SOAP 信息頁(yè)面 。

Soaprpc.com專(zhuān)門(mén)提供有關(guān) SOAP 信息的參考資料,SoapWare.org 和 SOAPClient.com 同樣如此。

關(guān)于作者

James Snell 是一位撰稿人和開(kāi)發(fā)人員,他也是 IBM Web 服務(wù)開(kāi)發(fā)小組最新成員之一。他在進(jìn)入 IBM 之前,已經(jīng)具有關(guān)于定制企業(yè)應(yīng)用開(kāi)發(fā)和商家對(duì)商家這些方面的背景,而且他對(duì) Web 技術(shù)前沿方面有極大的熱情。可以通過(guò) jasnell@us.ibm.com 與他聯(lián)系。


瀏覽:Web服務(wù)內(nèi)幕,第1部分

Web服務(wù)內(nèi)幕,第2部分

Web服務(wù)內(nèi)幕,第4部分

Web服務(wù)內(nèi)幕,第5部分

Web服務(wù)內(nèi)幕,第6部分

Web服務(wù)內(nèi)幕,第7部分

Web服務(wù)內(nèi)幕,第8部分

Web服務(wù)內(nèi)幕,第9部分

Web服務(wù)內(nèi)幕,第10部分

發(fā)布:2007-03-25 13:26    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章: