當前位置:工程項目OA系統(tǒng) > 泛普各地 > 河北O(jiān)A系統(tǒng) > 石家莊OA系統(tǒng) > 石家莊OA信息化
無SOAP的Web服務(wù),第一部分
無SOAP的Web服務(wù),第一部分
--WSIF怎樣領(lǐng)先于當前用于Web服務(wù)的客戶機編程模型
Nirmal K. Mukhi(nmukhi@us.ibm.com)
副研究員,IBM Research
2001 年 9 月
即使 SOAP 只是眾多訪問 Web 服務(wù)的可能的綁定之一,它已幾乎成為 Web 服務(wù)的同義詞。這意味著使用 Web
服務(wù)的應(yīng)用程序通常通過綁到 SOAP 的特定實現(xiàn)的 API 來完成工作。本系列文章將描述一個更通用的、獨立于 SOAP 的調(diào)用 Web
服務(wù)的方法,稱之為“Web 服務(wù)調(diào)用框架”(Web Service Invocation Framework(WSIF))。它專門設(shè)計來直接調(diào)用用“Web
服務(wù)描述語言”(Web Services Description Language(WSDL))描述的 Web 服務(wù),隱藏了底層訪問協(xié)議(比如
SOAP)的復(fù)雜性。
Web 服務(wù)承諾為因特網(wǎng)分布式計算提供基于標準的平臺,集中在簡易性和靈活性。一種關(guān)鍵的 Web 服務(wù)技術(shù)是
WSDL,即“Web 服務(wù)描述語言”。使用 WSDL,開發(fā)者可以以抽象的形式描述 Web 服務(wù),與用在其它分布式計算框架(比如
CORBA)的現(xiàn)有“接口描述語言”(Interface Description Language(IDL))類似。WSDL 也使 Web
服務(wù)開發(fā)者能夠給服務(wù)指定具體的綁定。并且這些綁定描述怎樣將抽象服務(wù)描述映射到特定訪問協(xié)議。WSDL
的這部分是可擴展的,這就是說任何人都可以提出他們自己的綁定,使之可能通過某個定制的協(xié)議訪問服務(wù)。
因此,從某種程度來說,使用 Web 服務(wù)是一種挑戰(zhàn)。對于同樣的服務(wù)可以有多個綁定。這些綁定中的一些可能適合于一些情形,其它可能適合于另外的情形。綁定本身可以代表抽象服務(wù)描述到用來訪問服務(wù)的任意一種協(xié)議的映射。雖然有多種選擇使用服務(wù)和允許綁定擴展是很有用的,但這給客戶機以統(tǒng)一方式查看服務(wù)造成了困難。
我以當前客戶機端 API 及其性能的討論開始這篇文章。我將通過討論來激發(fā)人們對 WSIF,即“Web 服務(wù)調(diào)用框架”的需要,然后繼續(xù)進行 WSIF 的概述。
當前的調(diào)用風(fēng)格及其缺點
用于 Web 服務(wù)的 SOAP 綁定是 WSDL
規(guī)范的一部分。在大多數(shù)編程語言中,該協(xié)議有可用的實現(xiàn)和工具,在許多情況下是免費的。這樣,它使得開發(fā)者能以微乎其微的成本進行用于 Web
服務(wù)的獨立于平臺的開發(fā)。
因此,下述情況是不足為奇的:大多數(shù)開發(fā)者當想到使用 Web 服務(wù)時,在他們頭腦中出現(xiàn)的是使用某個 SOAP 客戶機 API 來裝配一個 SOAP 消息并將它經(jīng)由網(wǎng)絡(luò)發(fā)送到服務(wù)端點。例如,使用 Apache SOAP,客戶機將創(chuàng)建和植入一個 Call 對象。它封裝了服務(wù)端點、要調(diào)用的 SOAP 操作的標識、必須發(fā)送的參數(shù)等等。而這是對 SOAP 而言,它僅限于將其用作調(diào)用 Web 服務(wù)的一般模型,這是因為下面的原因:
Web 服務(wù)不僅僅是 SOAP 服務(wù)
將 Web 服務(wù)視為 SOAP
上提供的服務(wù)的同義詞。這是對 Web 服務(wù)狹隘的見解。帶有功能方面和訪問協(xié)議 WSDL 描述的任何一段代碼均可以被認為是 Web 服務(wù)。WSDL 規(guī)范為 Web
服務(wù)定義了 SOAP 綁定,但是原則上可能要添加綁定擴展,這樣,例如,使用 RMI/IIOP 作為訪問協(xié)議,EJB 就可以作為 Web
服務(wù)來提供。或者您甚至可以想象任意一個 Java 類可以被當作 Web 服務(wù),以本機 Java 調(diào)用作為訪問協(xié)議。就這個更廣闊的 Web
服務(wù)定義來說,您需要用于服務(wù)調(diào)用的獨立于綁定的機制。
將客戶機代碼綁到一個特殊的協(xié)議實現(xiàn)要受到限制
將客戶機代碼緊密地綁定到特殊的協(xié)議實現(xiàn)的客戶機庫造成了難以維護的代碼。讓我們假設(shè)您在客戶機端有一個用
Apache SOAP v2.1 調(diào)用 Web 服務(wù)的應(yīng)用程序。如果您想利用 v2.2
中出現(xiàn)的新的功能和錯誤修正,您將不得不更新所有的客戶機代碼,這是一項耗時的任務(wù),將涉及到常見的令人頭痛的遷移問題。類似的,如果您想從 Apache SOAP
移到一個不同的 SOAP
實現(xiàn),這個過程并非無關(guān)緊要。所需要的是用于服務(wù)調(diào)用的獨立于協(xié)議實現(xiàn)的機制。
將新的綁定融入到客戶機代碼是很困難的。
WSDL
允許有定義新的綁定的可擴展性元素。這使開發(fā)者能夠定義綁定,這種綁定允許使用某種定制協(xié)議的代碼作為 Web
服務(wù)。但是,事實上實現(xiàn)起來是很困難的。將不得不設(shè)計使用該協(xié)議的客戶機 API 。應(yīng)用程序本身可能正是使用 Web
服務(wù)的抽象接口,因此將必須編寫一些工具來生成啟用抽象層的存根。這些又一次是并非無關(guān)緊要的而且耗時的任務(wù)。所需要的是使綁定能夠被更新或新的綁定能夠容易地插入的服務(wù)調(diào)用機制。
可以以靈活的方式使用多綁定
例如,設(shè)想您已經(jīng)成功地部署了一個應(yīng)用程序,該應(yīng)用程序使用提供多綁定的
Web 服務(wù)。為了使這個示例更具體,假設(shè)您有用于服務(wù)的 SOAP 綁定和允許您將本地服務(wù)實現(xiàn)(一個 Java 類)作為 Web 服務(wù)的本地 Java
綁定。顯而易見,如果客戶機部署在與服務(wù)本身相同的環(huán)境中,只能使用面向服務(wù)的本地 Java 綁定,并且如果情況確實如此,通過直接進行 Java 調(diào)用而不是使用
SOAP 綁定與服務(wù)進行通信將高效得多。Java 綁定作為一種快捷訪問機制。接下來,想要利用多綁定可用性的客戶機將必須具有一種能力 —
根據(jù)運行時信息對要用的實際綁定進行切換的能力。因此為了利用提供多綁定的 Web
服務(wù),您需要一種服務(wù)調(diào)用機制,允許您在運行時在可用的服務(wù)綁定之間進行切換,而不需要生成或重編譯存根。
介紹
WSIF
“Web 服務(wù)調(diào)用框架”(WSIF)是為調(diào)用 Web 服務(wù)提供簡單 API
的工具箱,而不管服務(wù)怎樣提供或由哪里提供。它具有上面討論中我確定的所有功能:
有給任何 Web 服務(wù)提供獨立于綁定訪問的
API。
提供端口類型編譯器來生成允許使用抽象服務(wù)接口的調(diào)用的存根。
允許無存根(完全動態(tài))的 Web
服務(wù)調(diào)用。
可以在運行時將更新的綁定實現(xiàn)插入到
WSIF。
可以在運行時插入的新的綁定。
允許將綁定選擇延后到運行時。
分析 WSIF 的客戶機 API
為了進行討論,我將使用很常見的股票報價程序 —
Web 服務(wù)的“Hello World”示例。請考慮下面清單 1 所示的使用 WSDL 的抽象服務(wù)描述。
清單 1:股票報價 Web 服務(wù)的 WSDL 描述
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns="http://schemas.xmlsoap.org/wsdl/">
足夠簡單:它描述了只帶有由一個端口類型提供一個操作的服務(wù)。該操作等待一個字符串,被解釋為股票的報價機符號,然后返回當前該股票報價,一個浮點值。為了實際使用該服務(wù),您需要某個定義訪問機制的綁定以及該綁定的服務(wù)端點。清單 2 展示了該服務(wù)的 SOAP 綁定:
清單 2:股票報價 Web 服務(wù)的 SOAP 綁定
xmlns:tns-int="http://www.ibm.com/namespace/wsif/samples/stockquote-interface"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:java="http://schemas.xmlsoap.org/wsdl/java/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
http://www.ibm.com/namespace/wsif/samples/stockquote-interface"
location="stockquote-interface.wsdl"/>
encodingStyle="
http://schemas.xmlsoap.org/soap/encoding/"/>
這是一個標準的 SOAP 綁定,使用 RPC 風(fēng)格和作為傳輸協(xié)議的 HTTP 與服務(wù)進行通信。在文檔的 port 部分中,我定義了使用 SOAP 綁定可以訪問服務(wù)的 URI。在清單 3 中,我將就通過 Apache SOAP 2.2 客戶機端 API 和 WSIF 的客戶機 API 使用該服務(wù)進行對比。
清單 3:用于服務(wù)訪問的 Apache SOAP API 與 WSIF API 對比
--------------------------------------------------------------------------------
Apache
SOAP
API
--------------------------------------------------------------------------------
//
Step 1: identify the service
Call call = new Call();
call.setTargetObjectURI("urn:xmltoday-delayed-quotes");
// Step 2:
identify the operation
call.setMethodName("getQuote");
call.setEncodingStyleURI(encodingStyleURI);
// Step 3: identify the
parameters
Vector params = new Vector();
params.addElement(new
Parameter("symbol",
String.class, symbol, null));
call.setParams(params);
// Step 4: execute the operation
Response resp = call.invoke(url,
"http://example.com/GetTradePrice");
// Step 5:
extract the result or fault
if(resp.generatedFault())
{
Fault fault
= resp.getFault();
System.out.println("Ouch, the call failed: ");
System.out.println(" Fault Code = " +
fault.getFaultCode());
System.out.println(" Fault String = " +
fault.getFaultString());
throw new SOAPException("Execution failed " + fault);
}
else
{
Parameter result = resp.getReturnValue();
return ((Float)
result.getValue()).floatValue();
}
--------------------------------------------------------------------------------
WSIF
API
--------------------------------------------------------------------------------
//
Step 1: identify the service
Definition def =
WSIFUtils.readWSDL(null,wsdlLocation);
// Step 2: identify the operation
(choose an
// appropriate service port)
WSIFDynamicPortFactory
portFactory =
new WSIFDynamicPortFactory(def, null, null);
// Get
default port
WSIFPort port = portFactory.getPort();
// The user can also
explicitly select a port
// to use.
// WSIFPort port =
//
portFactory.getPort("SOAPPort");
// Step 3: identify the parameters
//
Prepare the input message
WSIFMessage input = port.createInputMessage();
input.setPart("symbol",
new WSIFJavaPart(String.class, symbol));
//
Prepare a placeholder for the output value
WSIFMessage output =
port.createOutputMessage();
// Step 4: execute the operation
port.executeRequestResponseOperation("getQuote",
input, output,
null);
// Step 5: extract the result or fault
WSIFPart part =
output.getPart("quote");
return
((Float)part.getJavaValue()).floatValue();
正如您可以看到的,WSIF 的 API 由以 WSDL 編寫的抽象服務(wù)描述驅(qū)動;它完全從實際使用的綁定中分離出來。該調(diào)用 API 是面向 WSDL 的,并且使用它更自然,因為它使用 WSDL 術(shù)語引用消息部件(message part)、操作等等。當您閱讀一個 WSDL 描述,出于直覺會想到選用支持所需端口類型的端口,然后通過提供必需抽象輸入消息(由必要部件組成)調(diào)用操作(不用擔心怎樣將消息映射到特定的綁定協(xié)議);WSIF API 就是這樣設(shè)計的。
常用的 API,比如上面所示的 Apache SOAP API 采用了以特殊協(xié)議為中心的概念,比如在使用 SOAP 的情況下,目標 URI 和編碼風(fēng)格。這是不可避免的,因為 API 不是普遍適用于 WSDL,而是為特殊的協(xié)議設(shè)計。
兩種使用 WSIF 的調(diào)用模型
WSIF 允許 Web
服務(wù)以兩種方式調(diào)用。一種是無存根的動態(tài)調(diào)用,它要求直接使用 WSIF API;另一種是通過生成允許應(yīng)用程序使用 Java 接口(直接對應(yīng)于 WSDL
端口類型)和隱藏了 WSIF API 的存根的調(diào)用。
無存根(動態(tài)的)調(diào)用
訪問 Web 服務(wù)所需的所有信息 —
抽象接口、綁定和服務(wù)端點可以通過 WSDL 得到。如果您仔細查看上面的客戶機 API 示例,您將會注意到唯一由用戶提供的信息是用于服務(wù)的 WSDL
文件位置和所需要的股票報價符號。很明顯接下來是用 WSFL API 在運行時裝入這個服務(wù)和進行該調(diào)用。
WSIF 分發(fā)包包含了演示怎樣執(zhí)行 WSDL 的任意一個操作的 DynamicInvoker。它以 WSDL 文件的 URI 和所需的操作參數(shù)作為命令行參數(shù)(在最初的實現(xiàn)中只接受簡單的類型,如字符串),并且直接使用 WSIF API 完成工作。其用來調(diào)用股票報價服務(wù)的示例如清單 4 所示;您可以在包含 WSIF 分發(fā)包的文檔中查找詳細信息。
因為這類調(diào)用不會導(dǎo)致生成存根類,并且不需要單獨的編譯周期,所以它很方便。
清單 4:使用 DynamicInvoker 訪問股票報價服務(wù)
java
clients.DynamicInvoker http://services.xmethods.net/soap/urn:
xmethods-delayed-quotes.wsdl getQuote IBM
Reading WSDL document
from 'http://services.xmethods.net/soap/urn:
xmethods-delayed-quotes.wsdl'
Preparing
WSIF dynamic invocation
Executing operation
getQuote
Result:
Result=108.8
Done!
使用存根的調(diào)用
在應(yīng)用程序需要更抽象的服務(wù)視圖和不希望處理 WSIF 客戶機
API 的情況下,無存根調(diào)用不適用。WSIF 提供一個端口編譯器,如果給定一個 WSDL,與所用到的復(fù)雜類型的 Java 等價物(以 JavaBean
的形式)一起,端口編譯器將為每一個端口類型生成一個客戶機存根。使用生成存根的應(yīng)用程序可以利用抽象服務(wù)接口,并且這樣與協(xié)議和 WSIF 客戶機 API
分離。對于實際服務(wù)調(diào)用,這些存根使用缺省端口。通過由 WSIF 的端口類型編譯器生成的存根使用股票報價服務(wù)的示例如清單 5 所示。
清單 5:使用生成存根的 WSIF 訪問股票報價服務(wù)。
StockquotePT service = new StockquotePTStub(WSIFUtils.readWSDL(null,
wsdlLocation),
null, null);
float quote =
service.getQuote("IBM");
System.err.println (">> Received quote:
"+quote);
值得注意的是存根駐留在某些受管環(huán)境(如應(yīng)用程序服務(wù)器)的情況,它們能夠被定制;例如,可以改變負責返回恰當端口的工廠來定制端口選擇算法,或者可以改變用于調(diào)用自身的實際端口。
在這篇文章中,我略述了對 WSIF 的需要,分析其通過高級 API 進行獨立于綁定的服務(wù)訪問的主要特征以及生成可定制的存根(通過其抽象接口使用服務(wù))的端口類型編譯器的可用性。直接通過 SOAP 客戶機 API 和使用 WSIF API 進行服務(wù)訪問之間的對比展示了 WSIF(由服務(wù)的 WSDL 描述驅(qū)動)怎樣將 Web 服務(wù)調(diào)用的全部問題從以綁定為中心的觀點轉(zhuǎn)移到更抽象的級別。這是 WSIF 的設(shè)計原則之一,使服務(wù)綁定能被看作是根據(jù)特殊協(xié)議進行調(diào)用所需的代碼片斷,可以在任何時候插入它們。
在接下來的文章,我將分析 WSIF 的體系結(jié)構(gòu),看一看它怎樣允許新的或更新的綁定實現(xiàn)被插入,它怎樣使定制的類型系統(tǒng)用于 Web 服務(wù)以及怎樣使運行時環(huán)境使用定制的探索性方法在多端口之間進行選擇。
參考資料
- 請參加關(guān)于這篇文章的討論論壇。
- 請下載 alphaworks 上的 WSIF 分發(fā)包,并且試驗比較簡單的樣本。它將給您一個由 WSIF
支持的不同調(diào)用風(fēng)格的第一手示例以及它優(yōu)于特定協(xié)議客戶機 API 的優(yōu)勢。
- 重溫 WSDL 規(guī)范,看一看允許哪一種擴展;如果用來為訪問 Web 服務(wù)定義 SOAP
綁定,您也可以學(xué)習(xí) WSDL 的擴展機制。
- 重溫 SOAP 規(guī)范本身。
- 如果以前您沒有對 Web 服務(wù)編過程,Web Services Toolkit 是很好的起點。
- 請查看 WSDL4J,一個可擴展的 WSDL 分析框架,WSIF 在此基礎(chǔ)上進行構(gòu)建。
關(guān)于作者
Nirmal K. Mukhi 是 IBM 的
T J Watson Research Lab 的副研究員,自 2000 年 11 月,他一直在從事各種 Web 服務(wù)技術(shù)的研究。他還對
AI、創(chuàng)造性寫作以及過時的計算機游戲感興趣。您可以通過 nmukhi@us.ibm.com 與 Nirmal 聯(lián)系。
瀏覽:無SOAP的Web服務(wù),第二部分
- 1石家莊OA信息化如何管出企業(yè)前途(羅鼎)
- 2Web Services Description Language (WSDL) 1.1
- 3知識庫建設(shè)應(yīng)規(guī)避的5點具體誤區(qū)
- 4[編譯] 石家莊OA信息化測度:目標、過程及方法(夏敬華譯)
- 5Web服務(wù)內(nèi)幕,第9部分:研究問題--安全性與保密性
- 62001年度“世界最受贊賞的知識型企業(yè)”排名揭曉
- 7使用Visual Studio.Net建立web service
- 8bindingTemplate與Web服務(wù)調(diào)用
- 9使用Google的Web Service
- 10如何畫石家莊OA信息化項目實施方法論這幅地圖(by AMT夏敬華孔祥云)
- 11Accessing Web Services From DHTML
- 12泛普軟件石家莊OA信息化系統(tǒng)建設(shè)原則
- 13專家稱XML Web服務(wù)時代正接近尾聲
- 14不僅看投資回報,還要看“知識回報”
- 15Web服務(wù)設(shè)計師,第6部分:基于付費的Web服務(wù)的催化劑
- 16觀點:微軟的下個效仿對象是惠普
- 17Web服務(wù)的(革)創(chuàng)新,第2部分
- 18Building a Stock-Quotes Web Service
- 19一個副總裁的辭呈:癱瘓的信息化系統(tǒng)和人心
- 20InterOP Stack新一代平臺互操作技術(shù):InterOP Stack技術(shù)概覽
- 21為企業(yè)開啟Web服務(wù)之門-Sun ONE軟件產(chǎn)品發(fā)布會在京舉行
- 22在Web Service中使用ASP.net狀態(tài)保持
- 23OA辦公系統(tǒng)軟件信息傳遞的安全解決方案
- 24Web服務(wù)將突破規(guī)模限制 可應(yīng)用到臺式機上
- 25企業(yè)CIO剖析中小企業(yè)信息化發(fā)展建設(shè)盲點.
- 26石家莊OA信息化,知識組織和知識工作者:來自前沿的觀點
- 27石家莊OA信息化隨筆之一:石家莊OA信息化“突圍”(by AMT 夏敬華)
- 28泛普軟件石家莊OA信息化IT實施步驟與策略
- 29我國商貿(mào)業(yè)將迎來新一輪的IT建設(shè)高潮
- 30Web Services 及其技術(shù)(上)
成都公司:成都市成華區(qū)建設(shè)南路160號1層9號
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓
版權(quán)所有:泛普軟件 渝ICP備14008431號-2 渝公網(wǎng)安備50011202501700號 咨詢電話:400-8352-114