web Service簡單介紹與開發

什麼是 Web 服務?

 

Web 是使應用程序可以以與平臺和編程語言無關的方式進行相互通信的一項技術。Web 服務是一個軟件接口,它描述了一組可以在網絡上通過標準化的 XML 消息傳遞訪問的操作。它使用基於 XML 語言的協議來描述要執行的操作或者要與另一個 Web 服務交換的數據。一組以這種方式交互的 Web 服務在面向服務的體系結構(Service-Oriented ArchitectureSOA)中定義了特殊的 Web 服務應用程序。

軟件業最終會接受這樣的事實:跨多個操作系統、編程語言和硬件平臺集成軟件應用程序不可能由任何一種專門的環境來解決。傳統上,這個問題一直是一個緊耦合問題,調用遠程網絡的應用程序通過自己發出的函數調用和請求的參數與遠程網絡緊密地聯繫在一起。在 Web 服務出現之前,在大多數系統上,採用的是固定的接口,但對於環境或需要的改變,這缺乏靈活性或適用性。

Web 服務所使用的 XML 可以用真正與平臺無關的方式來描述任何(所有)數據,以跨系統交換數據,因此轉向了松耦合應用程序。而且,Web 服務可以在較抽象的層面上工作,較抽象層面可以按照需要動態地重新評估、修改或處理數據類型。所以,從技術層面上講,Web 服務可以更方便地處理數據,並且允許軟件更自由地進行通信。

從更高的概念層面上講,我們可以將 Web 服務視爲一些工作單元,每個單元處理特定的功能任務。再往上一步,可以將這些任務組合成面向業務的任務,以處理特定的業務操作任務,從而使非技術人員去考慮一些應用程序,這些應用程序可以在 Web 服務應用程序工作流中一起處理業務問題。因此,一旦由技術人員設計並構建好 Web 服務之後,業務流程架構設計師就可以聚集這些 Web 服務來解決業務層面上的問題。這裏借用汽車引擎來作類比,業務流程架構設計師考慮將整個汽車引擎與汽車框架、車身、變速器和其他系統組合在一起,而不是研究每個引擎內的各個部件。而且,動態的平臺意味着引擎可以與其他汽車製造商的變速器或部件一起工作。

最後一個方面是,Web 服務可以有助於在組織內的業務人員和技術人員之間架起一座橋樑。Web 服務使業務人員能更容易理解一些技術上的操作。業務人員可以描述出一些事件和活動,然後技術人員可以將這些事件和活動與相應的服務相關聯。

有了通用定義的接口和設計良好的任務,重用這些任務就變得更容易了,因而重用這些任務所代表的應用程序也就變得容易了。應用程序軟件的可重用性意味着在軟件上的投資有了更好的回報,因爲可以從同一資源產生更多收益。可重用性使業務人員可以考慮以一種新的方式來使用現有的應用程序,或者以一種新的方式將應用程序提供給合作伙伴,因此可能增加合作伙伴間的業務交易。

所以,Web 服務試圖解決的主要問題是數據和應用程序集成的問題,是將技術性的功能轉換成面向業務的計算任務的問題。這兩個方面使業務人員可以就流程或應用程序層面與他們的合作伙伴進行交流,同時爲適應新形勢或按照需要與不同合作伙伴進行合作留有動態的餘地。

 

 

WebService學習,開發總結

一, 基本概念:

1, 什麼是 Web 服務?

Web 是使應用程序可以以與平臺和編程語言無關的方式進行相互通信的一項技術。Web 服務是一個軟件接口,它描述了一組可以在網絡上通過標準化的 XML 消息傳遞訪問的操作。它使用基於 XML 語言的協議來描述要執行的操作或者要與另一個 Web 服務交換的數據。一組以這種方式交互的 Web 服務在面向服務的體系結構(Service-Oriented ArchitectureSOA)中定義了特殊的 Web 服務應用程序。

2, 什麼是SOAP

SOAPSimple Object Access Protocol )簡單對象訪問協議是在分散或分佈式的環境中交換信息並執行遠程過程調用的輕量級協議,是一個基於XML的協議。使用SOAP,不用考慮任何特定的傳輸協議(最常用的還是HTTP協議),可以允許任何類型的對象或代碼,在任何平臺上,以任何一種語言相互通信。

SOAP包括四個部分:SOAP封裝(envelop),封裝定義了一個描述消息中的內容是什麼,是誰發送的,誰應當接受並處理它以及如何處理它們的框架;SOAP編碼規則(encoding rules),用於表示應用程序需要使用的數據類型的實例;SOAP RPC表示(RPC representation),表示遠程過程調用和應答的協定;SOAP綁定(binding),使用底層協議交換信息。

應用中比較關注的是envelop,由一個或多個Header和一個Body組成。

SOAP在可互操作的基礎 Web 服務協議棧中的位置:

3, 什麼是Axis?

Axis本質上就是一個SOAP引擎(Apache Axis is an implementation of the SOAP),提供創建服務器端、客戶端和網關SOAP操作的基本框架。但Axis並不完全是一個SOAP引擎,它還包括:

是一個獨立的SOAP服務器。

是一個嵌入Servlet引擎(例如Tomcat)的服務器。

支持WSDL

提供轉化WSDLJava類的工具。

提供例子程序。

提供TCP/IP數據包監視工具。

4Axis相比Soap v2的優點:

Axis是第三代Apache SOAP的實現,從2000年起,SOAP v2開發小組開始討論如何讓Axis更加靈活、可配置,以及能夠處理SOAP和來自W3C的各種XML標準。通過不斷地討論和代碼編寫,Axis目前相比SOAP V2取得了如下成果:

速度提高。 Axis通過基於事件的SAXXML文檔進行處理,從而在速度和效率上比Apache SOAP有所提高。

靈活性提高。

穩定性提高。

提供面向組件的部署。

提供一個簡潔的傳輸抽象框架。其核心引擎完全於傳輸方式獨立。從而使基於何種協議傳輸的選擇更加靈活。

支持WSDL。包括WSDL和客戶端代碼生成等。

5, 什麼是WSDL

WSDLWeb Service Description LanguageWeb服務器描述語言是用XML文檔來描述Web服務的標準,是Web服務的接口定義語言,由AribaIntelIBMMS等共同提出,通過WSDL,可描述Web服務的三個基本屬性:

·服務做些什麼——服務所提供的操作(方法)

·如何訪問服務——和服務交互的數據格式以及必要協議

·服務位於何處——協議相關的地址,如URL

WSDL文檔以端口集合的形式來描述Web服務,WSDL 服務描述包含對一組操作和消息的一個抽象定義,綁定到這些操作和消息的一個具體協議,和這個綁定的一個網絡端點規範。

WSDLWeb 服務概念性協議棧中的位置:

6, 什麼是WSDD

WSDD就是WEB服務分佈描述(Web Service Deployment Descriptor, 它定義了WEB服務的接口,如服務名、提供的方法、方法的參數等信息。

7, 什麼是UDDI

UDDI就是統一描述、發現和集成(Universal Description, Discovery, and Integration)。UDDI用於集中存放和查找WSDL描述文件,起着目錄服務器的作用。

Web 服務中的角色、操作和構件:

·         服務提供者。從企業的角度看,這是服務的所有者。從體系結構的角度看,這是託管訪問服務的平臺。

·         服務請求者。從企業的角度看,這是要求滿足特定功能的企業。從體系結構的角度看,這是尋找並調用服務,或啓動與服務的交互的應用程序。服務請求者角色可以由瀏覽器來擔當,由人或無用戶界面的程序(例如,另外一個 Web 服務)來控制它。

·         服務註冊中心。這是可搜索的服務描述註冊中心,服務提供者在此發佈他們的服務描述。在靜態綁定開發或動態綁定執行期間,服務請求者查找服務並獲得服務的綁定信息(在服務描述中)。對於靜態綁定的服務請求者,服務註冊中心是體系結構中的可選角色,因爲服務提供者可以把描述直接發送給服務請求者。同樣,服務請求者可以從服務註冊中心以外的其它來源得到服務描述,例如本地文件、FTP 站點、Web 站點、廣告和服務發現(Advertisement and Discovery of ServicesADS)或發現 Web 服務(Discovery of Web ServicesDISCO)。

8AXIS的幾種服務類型:

AXIS有四種service styles,分別是:RPC, Document, Wrapped, Message。最常用的就是RPCMessage

RPCAXIS中是一個默認選項。當你部署的時候使用下列兩種方式:或則 ,它遵循SOAP RPC和編碼規則。每個RPC都包括一個表示名稱的外部接點和一些表示參數的內部接點。AXIS會根據規則將一個XMLWSDL文件)文件轉化成一個JAVA對象,並對對想賦上在文件中描述的值。也可以根據規則將一個JAVA對象轉化成XML文件。

Document

適合於老的XML schema

Wrapped

DOCUMENT一樣,適合於老的XML schema

在大多書情況下,你不許要擔心是DOCUMENT服務還是WRAPPED服務。

Message

以這種方式部署的話,會使AXIS失去意義,它使你的代碼真正的用XML形式,而不需要轉化成JAVA對象。以這種方式部署的有以下四種服務方法:

public Element [] method(Element [] bodies);

public SOAPBodyElement [] method (SOAPBodyElement [] bodies);

public Document method(Document body);

public void method(SOAPEnvelope req, SOAPEnvelope resp);

幾種服務類型的主要區別:

基於RPC(遠程過程調用)方式,這也是Web服務最常用的方式。面向消息/文檔的的類型跟RPC不同的是它提供了一個更底層的抽象,要求更多的編程工作。客戶端可以傳入任何的XML文檔,得到的響應不一定是SOAPEnvelope,可以返回任何它所需要的東西,甚至不返回。雖然這對開發者來說非常的靈活,但是這種通訊類型在實際的應用中並不常見。面向消息/文檔的Web服務主要適合於下面幾種情況,比如批量處理,基於表單的數據導入,有需要返回非XML數據時,Web服務器實現中要求直接訪問傳輸層等等

二, 開發,部署Web服務:

首先下載並安裝tomcat4.x.及以上版本

然後到Axis主頁下載,現在最新版本是1.3 final,我們使用的是1.2.1 final,將解壓的axis中的webapps目錄下的axis拷貝到tomcat安裝路徑下的webapp下,將解壓的axislib下的jar文件拷貝到tomcat安裝目錄下commonlib下,並把他們加入到你的系統路徑中。

然後啓動tomcat

打開IE,輸入:http://localhost:8080/axis,如果出現axis主頁,說明安裝axis成功。

部署web服務 在axis下部署web服務有以下兩種方式:

1. 即時部署(Instance Deployment)利用JWS文件

只需要將.java文件拷貝到axis目錄下,並將文件後綴改爲.jws即可。

訪問部署後的wsdl文件只需鍵入: http://localhost:8080/axis/filename.jws?wsdl

以下是WSDL的一個例子:

<?xml version="1.0" encoding="UTF-8"?>

<wsdl:definitions targetNamespace="http://service.kernel.gamebase.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://service.kernel.gamebase.com" xmlns:intf="http://service.kernel.gamebase.com" xmlns:tns1="http://vo.service.kernel.gamebase.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<wsdl:types> //描述消息中複雜數據類型的使用

<schema targetNamespace="http://vo.service.kernel.gamebase.com" xmlns="http://www.w3.org/2001/XMLSchema">

<import namespace="http://service.kernel.gamebase.com"/>

<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>

<complexType name="UserGameGrade">//定義複雜類型

<sequence>

<element name="MClassID" nillable="true" type="xsd:string"/>

<element name="gameID" nillable="true" type="xsd:string"/>

<element name="gradeType" type="xsd:int"/>

......

</sequence>

</complexType>

</schema>

......

</wsdl:types>

<wsdl:message name="getGameGradeRankResponse"> //定義操作的輸出參數

<wsdl:part name="getGameGradeRankReturn" type="tns1:GameGradeRank"/>

</wsdl:message>

<wsdl:message name="getGameGradeRankRequest"> //定義操作的輸入參數

<wsdl:part name="in0" type="xsd:string"/>

<wsdl:part name="in1" type="xsd:int"/>

<wsdl:part name="in2" type="xsd:int"/>

</wsdl:message>

......

<wsdl:portType name="GameGradeService"> // WSDL: portType 元素中定義了 Web 服務的操作。

<wsdl:operation name="getGameGradeRank" parameterOrder="in0 in1 in2"> //操作定義了輸入和輸出數據流中可以出現的 XML 消息

<wsdl:input message="impl:getGameGradeRankRequest" name="getGameGradeRankRequest"/>

<wsdl:output message="impl:getGameGradeRankResponse" name="getGameGradeRankResponse"/>

</wsdl:operation>

<wsdl:operation name="getUserGameGradeRank" parameterOrder="in0 in1 in2 in3 in4">

<wsdl:input message="impl:getUserGameGradeRankRequest" name="getUserGameGradeRankRequest"/>

<wsdl:output message="impl:getUserGameGradeRankResponse" name="getUserGameGradeRankResponse"/>

</wsdl:operation>

......

</wsdl:portType>

<wsdl:binding name="GameGradeServiceSoapBinding" type="impl:GameGradeService">//描述特定服務接口(WSDL: portType)的協議、數據格式、安全性和其它屬性

<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="getGameGradeRank">

<wsdlsoap:operation soapAction=""/>

<wsdl:input name="getGameGradeRankRequest">

<wsdlsoap:body namespace="http://service.kernel.gamebase.com" use="literal"/>

</wsdl:input>

<wsdl:output name="getGameGradeRankResponse">

<wsdlsoap:body namespace="http://service.kernel.gamebase.com" use="literal"/>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>

<wsdl:service name="GameGradeServiceService">//定義服務:名字,訪問點,位置

<wsdl:port binding="impl:GameGradeServiceSoapBinding" name="GameGradeService">

<wsdlsoap:address location="http://localhost:8080/gamebase/services/GameGradeService"/>

</wsdl:port>

</wsdl:service>

</wsdl:definitions>2.定製部署(Custom Deployment)利用部署描述符wsdd

以下是部署描述符的一個例子: <deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="GameGradeService" type="" provider="java:RPC"

style="rpc" use="encoded"> //服務名字,服務類型及服務提供者

<parameter name="scope" value="Request"/>

<parameter name="className" value="com.gamebase.kernel.service.ServiceImpl"/> //實現該服務的具體類

<parameter name="allowedMethods" value="*"/>

<namespace>http://service.kernel.gamebase.com</namespace>

<typeMapping xmlns:ns1="http://vo.service.kernel.gamebase.com" //類型映射

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

qname="ns1:GameGradeRank"//Qualified Name(特定名字)

languageSpecificType="java:com.gamebase.kernel.service.vo.GameGradeRank"

serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"//指定序列化工廠

deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" //反序列化工廠name="GameGradeRank"/>

………
</service>
</deployment>

訪問部署後的wsdl文件只需鍵入

http://localhost:8080/axis/services/ GameGradeService

三, 在IDE下開發Web服務:

1,Jubilder下開發WebService

使用Jbuilder集成開發環境,能夠根據服務接口類生成web服務描述文件,web服務部署描述文件及客戶端代碼,這樣能夠節省我們大部分時間(開發,配置),且減少出錯機率。

Jbuilder在以前的版本,如jbuilder8(可能更低版本)就支持Axis,我用的是Jbuilder2006,不過大體步驟都是相同。

在開始前,我們有個服務接口GameGradeService類,服務接口實現類ServiceImpl類及相關附屬類。我們要實現該服務接口。

2.1,打開Jbuilder,新建一個工程,如testWebService

2.2,新建一個名爲webServiceWebService Server file>new:WebServices:Axis WebServices Server Configuration

2.3, 在出現的Web Services Designers可視化界面,點擊“create Service”,選擇“java Service

2.4,配置新創建的java Service,點擊JavaService1,配置Service NameGameGradeService,服務接口爲我們有的那個服務接口GameGradeService,實現類爲我們實現改接口的類ServiceImpl

2.5,然後編譯該工程,能夠生成web服務部署文件,web服務描述文件,如果你選擇了生成客戶端代碼的話,它也能生成相應的客戶端代碼。

2.6,啓動該服務,訪問:http://localhost:8080/webService/services/GameGradeService?wsdl,如果出現該服務的描述文檔,說明發布成功。

2.7,執行自動生成的客戶端代碼進行測試,發現測試成功。

2.8,你可以用webServicewebServices Client來根據wsdl只生成客戶端代碼。

a,新建一個名爲webServiceClientWebService Clientfile>new:WebServices:Axis WebServices Client Configuration

b,在出現的Web Services Designers可視化界面,點擊“create Service”,選擇“import from url

c,配置新創建的java Service,點擊JavaService1,配置Service NameGameGradeServiceInput WSDL file 爲給定的wsdl

d,然後編譯該工程

2,eclipse下開發WebService

Eclipse3.1及相關插件已經能夠很好的支持webService開發。

右鍵點擊wsdl文件,選擇webServices,有以下功能:發佈wsdl文件,生成客戶端代碼等。

右鍵點擊服務接口文件,選擇webServices,有以下功能:生成web Service等。

同時eclipse提供了友好的界面操作,如測試的時候,提供界面讓你輸入參數,而不必該改程序。

四, 開發過程中的問題:

在使用AXIS開發WEB服務的時候,會遇到很多問題。比如:XML解析器出現的異常、客戶端程序找不到可用的Web服務、序列化/反序列化等。

XML解析器出現的異常主要是由於類型映射的問題導致的,用到那個Bean就把那個bean映射進去就可以避免該問題。

客戶端程序找不到可用的Web服務主要是由於客戶端對服務提供者的url及服務名字輸入有錯,這一般是由於手寫客戶端代碼造成的。

序列化/反序列化問題,沒有對傳輸中的某個Bean類型映射相應的序列化/反序列化工廠,或者是複雜類型中,沒有實現自定義的序列化/反序列化工廠。

以上是開發過程中主要遇到的幾類問題,在以後的開發過程中,一定還會需要遇到更多的問題。

五, 其他相關知識:

1java類與wsdl相互生成工具:

Axis提供了”WSDL2Java”工具,可以利用wsdl描述來產生服務的Java代理和框架(proxy and skeletons)

Axis提供了”Java2WSDL”工具,可以由java類生成wsdl文件。

2,序列化與反序列化:

序列化/反序列化器在英文中的對應翻譯是Serializer/Deserializer,一個序列化器的功能是遵循一定的映射規則和編碼風格,將一種類型的JAVA對象通過某種特定的機制,轉換成爲XML描述的形式;反序列化器的功能是序列化器所做工作的逆操作,兩者相輔相成,成對出現。Axis中的序列化/反序列化器採用設計範式中的工廠模式,每一個Serializer唯一對應一個SerializerFactory;每一個Deserializer唯一對應一個DeserializerFactory

Axis已經爲開發者提供了豐富的序列化/反序列化器,對於java的基本數據類型,絕大部分常用的容器類(比如數組類型,Vector類型等)都提供了實現,特別是提供了對W3CDOM對象(比如Document, Element)和符合Bean規範的JAVA對象提供了功能完善的序列化/反序列化器,但對於一些特殊類型的對象,需要通過Web服務進行傳遞,我們不得不開發自己的序列化/反序列化器。

3AxisSpring的結合:

Axisspring結合,需要提供一些額外工作,即將實現web服務接口的Beanweb服務部署中服務類如何關聯。 如下:

<service name="GameService" type="" provider="Handler" style="rpc">

<parameter name="handlerClass" value="com.workingmouse.webservice.axis.SpringBeanRPCProvider"/>

<parameter name="springBean" value="gameInfoService"/>

<parameter name="springBeanClass" value="com.gamebase.kernel.service.GameService"/>

<parameter name="scope" value="Request"/>

<parameter name="allowedMethods" value="*"/>

.......

</service>

參數handlerClass的值是處理Beanwsdd文件中服務類的關聯。

參數springBean的值表示實現接口GameService註冊的Bean的名字。

參數springBeanClass的值表示接口GameService的類。

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章