WebService初探(推薦)〔開心本人特別看好WebService〕
2024-07-21 02:21:31
供稿:網(wǎng)友
web service初探(推薦)<br>
<br>
<br>
<br>
簡介<br>
<br>
回顧過去的六年,難以想象如果沒有互聯(lián)網(wǎng)的話,網(wǎng)絡(luò)計(jì)算會(huì)變成什么樣。更早的超文本模式失敗了,而互聯(lián)網(wǎng)成功了,這其中最基本的原因可以歸結(jié)為:互聯(lián)網(wǎng)簡單且無處不在。從服務(wù)提供者(如網(wǎng)上商店)的角度來看,只要你會(huì)打字,你就可以接受服務(wù)。從服務(wù)api的角度來看,互聯(lián)網(wǎng)上絕大多數(shù)的活動(dòng)都可以由三種方法(get, post, 和put ) 以及一種標(biāo)記語言來完成。web service的興起正是基于這樣一個(gè)事實(shí):web不僅可以作為一個(gè)信息平臺(tái) ,也可以作為一個(gè)服務(wù)平臺(tái)。 <br>
這里的“services”不是指amazon.com提供的那種粗糙的服務(wù),而是一種組件服務(wù),其他人可以用來構(gòu)造更強(qiáng)大的服務(wù)。例如,microsoft提供了passport服務(wù),提供web上的認(rèn)證功能,所以,類似華盛頓郵報(bào)之類的電子報(bào)紙就不必自己開發(fā)認(rèn)證服務(wù),只要交給passport做就可以了。當(dāng)然,這只是一個(gè)假設(shè)。<br>
<br>
oracle的動(dòng)態(tài)服務(wù)白皮書(dynamic services whitepaper)提供了更多組件服務(wù)的例子:匯率轉(zhuǎn)換,翻譯,貨物運(yùn)輸?shù)鹊取bm對(duì)web service有一個(gè)更為正式的定義:<br>
<br>
web ervices 是一種新的web應(yīng)用程序分支,他們是自包含、自描述、模塊化的應(yīng)用,可以發(fā)布、定位、通過web調(diào)用。web service可以執(zhí)行從簡單的請(qǐng)求到復(fù)雜商務(wù)處理的任何功能。一旦部署以后,其他web services應(yīng)用程序可以發(fā)現(xiàn)并調(diào)用它部署的服務(wù)。<br>
<br>
ibm的web service指南接著說在幾年前web service還是一個(gè)效率低下無法引起人們興趣的概念。但是隨著帶寬和存儲(chǔ)變的更為便宜,內(nèi)容更為動(dòng)態(tài)化,對(duì)不同平臺(tái)上廣泛而多樣的計(jì)算設(shè)備的集成的要求也更為強(qiáng)烈,同時(shí),也使得人們對(duì)代價(jià)(帶寬和存儲(chǔ))不那么敏感。<br>
<br>
當(dāng)我已經(jīng)有了我中意的中間件平臺(tái)(rmi, jini, corba, dcom 等等)時(shí),為什么還要為web而煩惱呢?中間件確實(shí)提供了強(qiáng)大的服務(wù)實(shí)現(xiàn)手段,但是,他們當(dāng)中沒有一個(gè)是絕對(duì)的勝利者。web作為信息發(fā)布者的力量就在于簡單且無處不在,這對(duì)解決現(xiàn)在這樣一個(gè)分裂中間件世界很重要。web通過在傳統(tǒng)中間件平臺(tái)上更有效實(shí)現(xiàn)的services,來提供一個(gè)統(tǒng)一且廣泛適用的接口,這樣就改善了這個(gè)平臺(tái)。<br>
<br>
從一個(gè)n層應(yīng)用程序結(jié)構(gòu)的角度來看,web service只是一個(gè)方便程序訪問的包裝,服務(wù)還是要靠中間件來實(shí)現(xiàn)。訪問包括服務(wù)請(qǐng)求處理(監(jiān)聽者)和一個(gè)支持商業(yè)邏輯操作的接口,商業(yè)邏輯本身是由傳統(tǒng)的中間件平臺(tái)實(shí)現(xiàn)的。<br>
<br>
web services平臺(tái)<br>
<br>
那么什么是web service 平臺(tái)呢?最基本的平臺(tái)是xml加http。http是一個(gè)在internet上廣泛使用的協(xié)議。xml是一種元語言,你可以用它書寫特定的語言來描述客戶和服務(wù)之間或者組件和復(fù)雜服務(wù)之間的交互。在web server之后,xml格式的消息被轉(zhuǎn)變成中間件的請(qǐng)求,返回的結(jié)果也會(huì)轉(zhuǎn)化成xml格式。 <br>
<br>
你可能會(huì)問,這與說corba是idl加上rpc不是一樣嗎?這個(gè)平臺(tái)到底如何支持service的發(fā)現(xiàn),事務(wù),安全,認(rèn)證等等基本功能,以使它真正成為一個(gè)平臺(tái)呢? 下面我們將講述這一點(diǎn)。 <br>
<br>
有必要增加一些服務(wù),同時(shí)保持簡單性和普遍性,來把web構(gòu)建成一個(gè)功能更強(qiáng)大的平臺(tái)。可以認(rèn)為功能全面的web services平臺(tái)是xml+http+soap+wsdl+uddi。在更高層次上,可能還要加上一些尚未廣泛接受的技術(shù)如xaml,xlang, xkms,和xfs。<br>
<br>
以下是對(duì)這些平臺(tái)要素的簡要描述。需要指出的是,這些還是發(fā)展中的技術(shù),很多時(shí)候?qū)σ粋€(gè)問題會(huì)有多種解決方案。<br>
<br>
soap (遠(yuǎn)程調(diào)用) <br>
uddi (貿(mào)易,目錄服務(wù)) <br>
wsdl (描述服務(wù)特征) <br>
xlang/xaml (為包括多種web services的復(fù)雜web事務(wù)提供支持) <br>
xkms (xml key management specification) - 支持認(rèn)證和注冊,這個(gè)工作還在進(jìn)展之中 <br>
<br>
soap<br>
<br>
soap是一個(gè)協(xié)議規(guī)范,定義了傳遞xml-encoded數(shù)據(jù)時(shí)的統(tǒng)一方式。它還定義了使用http作為底層通信協(xié)議時(shí)執(zhí)行遠(yuǎn)程調(diào)用(rpc)的方法。<br>
<br>
soap的興起是基于這樣一種認(rèn)識(shí),無論現(xiàn)在的中間件是如何的好,他們都需要一個(gè)wan包裝。以xml格式發(fā)送消息有很多好處,如能夠確保互用性。中間件使用者看來愿意容忍解析和序列化xml文檔的代價(jià),因?yàn)檫@可以讓他們的軟件使用范圍更寬。<br>
<br>
ibm, microsoft, userland,和developmentor在2000年向w3c提交了soap,并成為w3c的note,soap更長遠(yuǎn)的發(fā)展規(guī)劃現(xiàn)在是由w3c的xml協(xié)議工作組來制定。這有力的表明了直到w3c工作組交付規(guī)范為止,soap都將是一個(gè)穩(wěn)定的規(guī)范。<br>
<br>
uddi (universal description, discovery and integration service)<br>
<br>
uddi為客戶提供了動(dòng)態(tài)查找其它web <br>
<br>
services的機(jī)制。使用uddi接口,商務(wù)處理可以動(dòng)態(tài)的連接到外部的商務(wù)合作者提供的服務(wù)上。一個(gè)uddi注冊類似于corba的trader,也可以把它想象成商業(yè)應(yīng)用程序的dns服務(wù)。一個(gè)uddi注冊有兩種客戶:要發(fā)布一個(gè)服務(wù)(和使用接口)的商務(wù)應(yīng)用,以及想要得到特定服務(wù)的客戶。下表是uddi提供服務(wù)的概述。uddi層在soap層之上,并假定請(qǐng)求和應(yīng)答都是以soap消息傳送的uddi對(duì)象。下面還包含了一個(gè)簡單的查詢。<br>
<br>
<br>
<br>
關(guān)于支持全方位的發(fā)現(xiàn)(full-featured discovery),uddi沒有一個(gè)近期的計(jì)劃。uddi希望能夠成為支持其它標(biāo)準(zhǔn)的更高層服務(wù)的基礎(chǔ)。uddi計(jì)劃支持更復(fù)雜的商務(wù)邏輯,包括層次型商業(yè)組織。uddi有著廣泛的支持,ibm, ariba,和 <br>
<br>
microsoft都全力推動(dòng)它。到目前為止,它還不是一個(gè)開放的標(biāo)準(zhǔn)。<br>
<br>
<br>
<br>
uddi 舉例<br>
<br>
<br>
查詢:下面在soap封裝之內(nèi)的查詢,返回microsoft的詳細(xì)信息。<br>
<br>
<br>
<br>
<find_business <br>
<br>
generic="1.0" xmlns="urn:uddi-org:api"> <br>
<br>
<br>
<br>
<br>
face=arial,helvetica> <br>
<br>
<name>microsoft</name> <br>
<br>
<br>
<br>
<br>
face=arial,helvetica></find_business><br>
<br>
<br>
<br>
結(jié)果:businessinfo元素中包含了microsoft注冊的服務(wù)信息,也包括這個(gè)uddi服務(wù)本身。<br>
<br>
<businesslist generic="1.0"<br>
operator="microsoft corporation"<br>
truncated="false"<br>
xmlns="urn:uddi-org:api"><br>
<businessinfos><br>
<businessinfo<br>
businesskey="0076b468-eb27-42e5-ac09-9955cff462a3"><br>
<name>microsoft corporation</name><br>
<description xml:lang="en"><br>
empowering people through great software -<br>
any time, any place and on any device is microsoft’s <br>
vision. as the worldwide leader in software for personal<br>
and business computing, we strive to produce innovative <br>
products and services that meet our customer’s<br>
</description><br>
<serviceinfos><br>
<serviceinfo<br>
businesskey="0076b468-eb27-42e5-ac09-9955cff462a3" <br>
servicekey="1ffe1f71-2af3-45fb-b788-09af7ff151a4"><br>
<name>web services for smart searching</name><br>
</serviceinfo><br>
<serviceinfo<br>
businesskey="0076b468-eb27-42e5-ac09-9955cff462a3"<br>
servicekey="8bf2f51f-8ed4-43fe-b665-38d8205d1333"><br>
<name>electronic business integration services</name><br>
</serviceinfo><br>
<serviceinfo<br>
businesskey="0076b468-eb27-42e5-ac09-9955cff462a3"<br>
servicekey="611c5867-384e-4ffd-b49c-28f93a7b4f9b"> <br>
<name>volume licensing select program</name> <br>
</serviceinfo><br>
<serviceinfo<br>
businesskey="0076b468-eb27-42e5-ac09-9955cff462a3"<br>
servicekey="a8e4999a-21a3-47fa-802e-ee50a88b266f"><br>
<name>uddi web sites</name><br>
</serviceinfo> <br>
</serviceinfos><br>
</businessinfo><br>
</businessinfos><br>
</businesslist><br>
<br>
wsdl :web服務(wù)定義語言<br>
<br>
wsdl為服務(wù)提供者提供了描述構(gòu)建在不同協(xié)議或編碼方式之上的web <br>
<br>
service請(qǐng)求基本格式的方法。wsdl用來描述一個(gè)web <br>
<br>
service能做什么,它的位置在哪里,如何調(diào)用它等等。在假定以soap/http/mime <br>
<br>
作為遠(yuǎn)程對(duì)象調(diào)用機(jī)制的情況下,wsdl會(huì)發(fā)揮最大作用。uddi注冊描述了web <br>
<br>
service的絕大多數(shù)方面,包括服務(wù)的綁定細(xì)節(jié)。wsdl可以看作是uddi服務(wù)描述的子集。<br>
<br>
<br>
<br>
wsdl將服務(wù)定義為一個(gè)網(wǎng)絡(luò)端點(diǎn)的集合,或者說端口的集合。在wsdl里面,端點(diǎn)及消息的抽象定義與它們具體的網(wǎng)絡(luò)實(shí)現(xiàn)和數(shù)據(jù)格式綁定是分離的。這樣就可以重用這些抽象定義:消息,需要交換的數(shù)據(jù)的抽象描述;端口類型,操作的抽象集合。針對(duì)一個(gè)特定端口類型的具體協(xié)議和數(shù)據(jù)格式規(guī)范構(gòu)成一個(gè)可重用的綁定。一個(gè)端口定義成網(wǎng)絡(luò)地址和可重用的綁定的聯(lián)接,端口的集合定義為服務(wù)。因此一個(gè)wsdl文檔在定義網(wǎng)絡(luò)服務(wù)的時(shí)候使用如下的元素:<br>
類型-- <br>
<br>
使用某種的類型系統(tǒng)(比如xsd)定義數(shù)據(jù)類型的容器 <br>
消息-- 通訊數(shù)據(jù)抽象的有類型的定義 <br>
操作-- <br>
<br>
服務(wù)支持的動(dòng)作的抽象描述 <br>
端口類型-- 一個(gè)操作的抽象集合,該操作由一個(gè)或多個(gè)端點(diǎn)支持 <br>
綁定-- <br>
<br>
針對(duì)一個(gè)特定端口類型的具體的協(xié)議規(guī)范和數(shù)據(jù)格式規(guī)范 <br>
端口-- 一個(gè)單一的端點(diǎn),定義成一個(gè)綁定和一個(gè)網(wǎng)絡(luò)地址的聯(lián)接 <br>
<br>
<br>
服務(wù)-- 相關(guān)的端點(diǎn)的集合 <br>
<br>
<br>
<br>
所以,可以這樣說,wsdl給客戶提供了一個(gè)模板,方便他們描述和綁定服務(wù)。<br>
<br>
<br>
<br>
下面是一個(gè)簡單的例子,例子中的服務(wù)用來查找motorala股票的價(jià)格。<br>
<br>
服務(wù)描述:<br>
<br>
<?xml version="1.0"?><br>
<definitions name="stockquote"<br>
targetnamespace="http://example.com/stockquote.wsdl"<br>
xmlns:tns="http://example.com/stockquote.wsdl"<br>
xmlns:xsd1="http://example.com/stockquote.xsd"<br>
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"<br>
xmlns="http://schemas.xmlsoap.org/wsdl/"><br>
<types><br>
<schema targetnamespace="http://example.com/stockquote.xsd"<br>
xmlns="http://www.w3.org/1999/xmlschema"> <br>
<element name="tradepricerequest"><br>
<complextype><br>
<all><br>
<element name="tickersymbol" type="string"/><br>
</all> <br>
</complextype> <br>
</element><br>
<element name="tradeprice"> <br>
<complextype> <br>
<all><br>
<element name="price" type="float"/> <br>
</all> <br>
</complextype> <br>
</element> <br>
</schema><br>
</types><br>
<br>
<message name="getlasttradepriceinput"><br>
<part name="body" element="xsd1:tradeprice"/><br>
</message><br>
<message name="getlasttradepriceoutput"><br>
<part name="body" element="xsd1:tradepriceresult"/><br>
</message><br>
<br>
<porttype name="stockquoteporttype"><br>
<operation name="getlasttradeprice"><br>
<input message="tns:getlasttradepriceinput"/><br>
<output message="tns:getlasttradepriceoutput"/><br>
</operation><br>
</porttype><br>
<br>
<binding name="stockquotesoapbinding"<br>
type="tns:stockquoteporttype"><br>
<soap:binding style="document"<br>
transport="http://schemas.xmlsoap.org/soap/http"/><br>
<operation name="getlasttradeprice"><br>
<soap:operation<br>
soapaction="http://example.com/getlasttradeprice"/> <br>
<input><br>
<soap:body use="literal" <br>
namespace="http://example.com/stockquote.xsd"<br>
encodingstyle="http://schemas.xmlsoap.org/soap/encoding/"/><br>
</input> <br>
<output><br>
<soap:body use="literal" <br>
namespace="http://example.com/stockquote.xsd"<br>
encodingstyle="http://schemas.xmlsoap.org/soap/encoding/"/> <br>
</output> <br>
</operation><br>
</binding><br>
<br>
<service name="stockquoteservice"><br>
<documentation>my first service</documentation><br>
<port name="stockquoteport" binding="tns:stockquotebinding"> <br>
<soap:address location="http://example.com/stockquote"/><br>
</port><br>
</service><br>
<br>
</definitions><br>
<br>
<binding name="stockquoteservicebinding" <br>
type="stockquoteservicetype"> <br>
<soap:binding style="rpc"<br>
transport="http://schemas.xmlsoap.org/soap/http"/><br>
<operation name="getquote"> <br>
<soap:operation <br>
soapaction="http://www.getquote.com/getquote"/><br>
<input><br>
<soap:body type="inmessagerequest"<br>
namespace="urn:live-stock-quotes" <br>
encoding="http://schemas.xmlsoap.org/soap/encoding/"/> <br>
</input><br>
<output><br>
<soap:body type="outmessageresponse"<br>
encoding="http://schemas.xmlsoap.org/soap/encoding/"/><br>
</output><br>
</operation> <br>
</binding><br>
<service name="stockquoteservice"><br>
<documentation>my first service<br>
</documentation><br>
<port name="stockquoteport"<br>
binding="tns:stockquotebinding"><br>
<soap:address location="http://example.com/stockquote"/><br>
</port><br>
</service><br>
</definitions><br>
<br>
soap請(qǐng)求:<br>
<br>
post /stockquote http/1.1<br>
host: www.stockquoteserver.com<br>
content-type: text/xml;<br>
charset="utf-8"<br>
content-length: nnnn<br>
soapaction: "some-uri"<br>
<br>
<soap-env:envelope<br>
xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" <br>
soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/"> <br>
<soap-env:body><br>
<m:getlasttradeprice<br>
xmlns:m="some-uri"><br>
<symbol>mot</symbol><br>
</m:getlasttradeprice> <br>
</soap-env:body><br>
</soap-env:envelope><br>
<br>
soap應(yīng)答:<br>
<br>
http/1.1 200 ok content-type: text/xml; charset="utf-8"<br>
content-length: nnnn<br>
<br>
<soap-env:envelope<br>
xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"<br>
soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/"/> <br>
<soap-env:body><br>
<m:getlasttradepriceresponse<br>
xmlns:m="some-uri"><br>
<price>14.5</price><br>
</m:getlasttradepriceresponse><br>
</soap-env:body><br>
</soap-env:envelope><br>
<br>
xlang<br>
<br>
<br>
數(shù)據(jù)庫中的事務(wù)的傳統(tǒng)概念是原子性,即要么不做,要么全做。在分布式的系統(tǒng)中維持這種原子性,一般采用一種代價(jià)昂貴的處理方式,即兩相承諾。另一個(gè)相對(duì)優(yōu)化的模型也在研究之中(最初叫做sagas,由hector <br>
<br>
garcia-molina提出),即每個(gè)動(dòng)作都有一個(gè)明確的互補(bǔ)動(dòng)作,用以取消該動(dòng)作產(chǎn)生的結(jié)果。在現(xiàn)實(shí)生活中,這種互補(bǔ)動(dòng)作的例子很多,比如說,你在信用卡里取出$52,互補(bǔ)動(dòng)作就是存入$52,你發(fā)出一封email說“你將會(huì)在7天內(nèi)拿到你預(yù)定的產(chǎn)品”,互補(bǔ)動(dòng)作就是發(fā)email說“哦,你還得多等幾天”。xlang就是基于這樣一個(gè)概念,用來表示任何要取消的請(qǐng)求的互補(bǔ)動(dòng)作。而web <br>
<br>
service的分布式基礎(chǔ)將推動(dòng)xlang規(guī)范的發(fā)展,使之能完成復(fù)雜的撤銷操作。 <br>
<br>
xaml<br>
<br>
transaction authority markup language (xaml)提供了傳統(tǒng)的兩相承諾事務(wù)語義。在xaml規(guī)范中有一個(gè)b2b事務(wù)的例子。xaml不完全局限于兩相承諾,某些操作也可以象xlang一樣有互補(bǔ)動(dòng)作。兩相承諾在企業(yè)集成中顯然是很有效的,而大量的web事務(wù)(如b2c事務(wù))在更便宜的互補(bǔ)動(dòng)作模型中可以完成。除非xaml把互補(bǔ)動(dòng)作放在第一位,否則還是xlang存在的的理由更充分。<br>
<br>
scenario<br>
<br>
下面的場景演示了一個(gè)商業(yè)事務(wù),包括一批web service,并將利用xaml。考慮一家公司在網(wǎng)上向一家化工廠購買苯。為了讓買家能夠購買,賣方必須有第三方提供的附加增值服務(wù),如運(yùn)貨方式,付款方式,意外保險(xiǎn),安全運(yùn)輸執(zhí)照等等。必須等到所有服務(wù)都就緒且滿足他的要求,買方才會(huì)同意購買。他可以買或者不買,換句話說,必須滿足所有的相關(guān)要求,才有可能完成這次商務(wù)活動(dòng)。<br>
<br>
提供頂層商業(yè)事務(wù)功能的軟件必須協(xié)調(diào)每個(gè)web service。包括(1)賣方存貨系統(tǒng);(2)保險(xiǎn)服務(wù)確保產(chǎn)品能被運(yùn)輸;(3)財(cái)務(wù)服務(wù)確保依照賣方的形式付款;(4)運(yùn)輸服務(wù)保證按時(shí)發(fā)送貨物;(5)協(xié)調(diào)服務(wù)確保與政府的安全要求一致。<br>
<br>
xkms (xml key management specification)<br>
<br>
xkms是microsoft和verisign用xml應(yīng)用程序集成pki和數(shù)字認(rèn)證(用于internet事務(wù)安全性)的成果。關(guān)鍵的思想是將簽名處理放到web上的可信服務(wù)器(trust server)上,這樣小客戶就不必自己來做這些內(nèi)容。xkms依賴于xml數(shù)字簽名規(guī)范和正在制定中的xml加密規(guī)范。現(xiàn)在的xkms規(guī)范依賴于xml,soap,wsdl。<br>
<br>
其它例子<br>
<br>
web service平臺(tái)是一個(gè)發(fā)展的生態(tài)系統(tǒng),達(dá)爾文主義還在起作用,這里有進(jìn)化,有競爭,還有混亂。下面是一個(gè)小例子。<br>
<br>
xfs <br>
<br>
xmethods 文件系統(tǒng)服務(wù)讓你能夠通過soap接口讀或貼文件。這個(gè)系統(tǒng)讓開發(fā)者可以創(chuàng)建使用集中而穩(wěn)定數(shù)據(jù)的服務(wù)。理想情況下,這種文件系統(tǒng)能夠用來集中被多個(gè)節(jié)點(diǎn)訪問的信息。例如,可以用它支持程序補(bǔ)丁的自動(dòng)升級(jí)。xfs提供了一個(gè)客戶端工具,在windows explorer中集成了xfs web service,這樣windows explorer集成了基于xml-soap的文件系統(tǒng)。xfs是開放源碼的,由xmethods.com始創(chuàng),它的前景還不清楚,但是,這個(gè)想法在技術(shù)上是很有吸引力的。<br>
<br>
<br>
<br>
注冊會(huì)員,創(chuàng)建你的web開發(fā)資料庫,