WebService是一種可以接收從Internet或者Intranet上的其它系統(tǒng)中傳遞過(guò)來(lái)的請(qǐng)求,輕量級(jí)的獨(dú)立的通訊技術(shù)。
這種技術(shù)允許網(wǎng)絡(luò)上的所有系統(tǒng)進(jìn)行交互。隨著技術(shù)的發(fā)展,一個(gè)Web服務(wù)可以包含額外的指定功能并且可以在多個(gè)B2B應(yīng)用中協(xié)作通訊。 Web服務(wù)可以理解請(qǐng)求中上下文的關(guān)系,并且在每一個(gè)特定的情況下產(chǎn)生動(dòng)態(tài)的結(jié)果。這些服務(wù)會(huì)根據(jù)用戶的身份,地點(diǎn)以及產(chǎn)生請(qǐng)求的原因來(lái)改變不同的處理,用以產(chǎn)生一個(gè)唯一的,定制的方案。這種協(xié)作機(jī)制對(duì)那些只對(duì)最終結(jié)果有興趣的用戶來(lái)說(shuō),是完全透明的。
對(duì)于商業(yè)用戶來(lái)說(shuō),要找到一個(gè)自己需要使用的服務(wù),他必須知道如何來(lái)調(diào)用。 WSDL (Web Services Description Language) 規(guī)范是一個(gè)描述接口,語(yǔ)義以及Web服務(wù)為了響應(yīng)請(qǐng)求需要經(jīng)常處理的工作的XML文檔。這將使簡(jiǎn)單地服務(wù)方便,快速地被描述和記錄。以下是一個(gè)WSDL的樣例:
<definitions name="StockQuote"
targetNamespace="http://example.com/stockquote.wsdl"
xmlns:tns="http://example.com/stockquote.wsdl"
xmlns:xsd1="http://example.com/stockquote.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<schema targetNamespace=http://example.com/stockquote.xsd
xmlns="http://www.w3.org/2000/10/XMLSchema">
<element name="TradePriceRequest">
<complexType>
<all>
<element name="tickerSymbol" type="string"/>
</all>
</complexType>
</element>
<element name="TradePrice">
<complexType>
<all>
<element name="price" type="float"/>
</all>
</complexType>
</element>
</schema>
</types>
<message name="GetLastTradePriceInput">
<part name="body" element="xsd1:TradePriceRequest"/>
</message>
<message name="GetLastTradePriceOutput">
<part name="body" element="xsd1:TradePrice"/>
</message>
<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType>
<binding name="StockQuoteSoapBinding"
type="tns:StockQuotePortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation
soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>
</definitions>
它包含了以下的關(guān)鍵信息: 消息的描述和格式定義可以通過(guò)XML文檔中的<types>和<message> 標(biāo)記來(lái)傳送。 <portType> 標(biāo)記中表示了消息傳送機(jī)制。 (e.g. request-only, request-response, response-only) 。 <binding> 標(biāo)記指定了編碼的規(guī)范 。 <service> 標(biāo)記中表示服務(wù)所處的位置 (URL)。 WSDL在UDDI中總是作為一個(gè)接口描述文檔。因?yàn)閁DDI是一個(gè)通用的用來(lái)注冊(cè)WSDL規(guī)范的地方,UDDI的規(guī)范并不限制任何類(lèi)型或者格式描述文檔。這些文檔可能是一個(gè)WSDL文檔,或者是一個(gè)正規(guī)的包含導(dǎo)向文檔的Web頁(yè)面,也可能只是一個(gè)包含聯(lián)系信息的電子郵件地址?,F(xiàn)在Java提供了一個(gè) Java API for WSDL (JWSDL)規(guī)范。它提供了一套能快速處理WSDL文檔的方法,并且不用直接對(duì)XML文檔進(jìn)行操作,它會(huì)比JAXP更方便,更快速。
當(dāng)商業(yè)用戶通過(guò)UDDI找到你的WSDL描述文檔后,他通過(guò)可以Simple Object Access Protocol (SOAP) 調(diào)用你建立的Web服務(wù)中的一個(gè)或多個(gè)操作。 SOAP是XML文檔形式的調(diào)用商業(yè)方法的規(guī)范,它可以支持不同的底層接口,象HTTP(S)或者SMTP。 之所以使用XML是因?yàn)樗莫?dú)立于編程語(yǔ)言,良好的可擴(kuò)展性以及強(qiáng)大的工業(yè)支持。之所以使用HTTP是因?yàn)閹缀跛械木W(wǎng)絡(luò)系統(tǒng)都可以用這種協(xié)議來(lái)通信,由于它是一種簡(jiǎn)單協(xié)議,所以可以與任何系統(tǒng)結(jié)合,還有一個(gè)原因就是它可以利用80端口來(lái)穿越過(guò)防火墻。 SOAP的強(qiáng)大是因?yàn)樗?jiǎn)單。SOAP是一種輕量級(jí)的,非常容易理解的技術(shù),并且很容易實(shí)現(xiàn)。它有工業(yè)支持,可以從各主要的電子商務(wù)平臺(tái)供應(yīng)商那里獲得。從技術(shù)角度來(lái)看,SOAP詳細(xì)指明了如何響應(yīng)不同的請(qǐng)求以及如何對(duì)參數(shù)編碼。一個(gè)SOAP封裝了可選的頭信息和正文,并且通常使用HTTP POST方法來(lái)傳送到一個(gè)HTTP 服務(wù)器,當(dāng)然其他方法也是可以的,例如SMTP。SOAP同時(shí)支持消息傳送和遠(yuǎn)程過(guò)程調(diào)用。以下是一個(gè)SOAP請(qǐng)求。
Host: www.stockquoteserver.com
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI" <SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
<SOAP-ENV:Header>
<t:Transaction xmlns:t="some-URI" SOAP-ENV:mustUnderstand="1">
5
</t:Transaction>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<m:GetLastTradePrice xmlns:m="Some-URI">
<symbol>SUNW</symbol>
</m:GetLastTradePrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
當(dāng)從商業(yè)合作伙伴那里接收一個(gè)Web服務(wù)的請(qǐng)求時(shí),我們需要Java API實(shí)現(xiàn)一個(gè)Servlet來(lái)處理ebXML消息,就象我們用JAX/RPC來(lái)處理SOAP請(qǐng)求一樣。 Java API for XML Messaging (JAXM) 是集成XML消息標(biāo)準(zhǔn)(象ebXML消息或者SOAP消息)的規(guī)范。 這個(gè)API是用來(lái)推動(dòng)XML消息處理的,它檢測(cè)那些預(yù)定單的消息格式以及約束。它控制了所有的消息封裝機(jī)制,用一種直觀的方式分割了消息中的信息,象路由信息,發(fā)貨單。這樣,開(kāi)發(fā)人員只要關(guān)注消息的有效負(fù)載,而不用去擔(dān)心那些消息的重復(fù)處理。目前的開(kāi)發(fā)人員用JAXP來(lái)實(shí)現(xiàn)JAXM將要提供的功能,JAXM將會(huì)提供一套非常具有針對(duì)性的API來(lái)處理基于XML的消息傳送。這將大大簡(jiǎn)化開(kāi)發(fā)人員的代碼,并使它們具有統(tǒng)一的接口。 JAXM和JAX/RPC的差別在于處理消息導(dǎo)向的中間件以及遠(yuǎn)程過(guò)程調(diào)用的不同。JAXM注重于消息導(dǎo)向,而JAX/RPC是用來(lái)完成遠(yuǎn)程過(guò)程調(diào)用的。
請(qǐng)注意,在JAXM 和 JAX/RPC技術(shù)成熟之前,開(kāi)發(fā)人員還是依賴于第三方的SOAP APIs,象Apache SOAP, IdooXOAP, 以及 GLUE。當(dāng)JAXM 和 JAX/RPC正式發(fā)布后,它將為當(dāng)前不同的SOAP和ebXML消息提供統(tǒng)一的接口。就象JDBC位多種不同的數(shù)據(jù)庫(kù)提供統(tǒng)一的接口。
聯(lián)系客服