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