No.1 什麼是WebService
?
WebService
技術,能使得運行在不同機器上的不同應用無須藉助附加的、專門的第三方軟件或硬件,就可相互交換數據或集成。
依據WebService
規範實施的應用之間,無論它們所使用的語言、平臺或內部協議是什麼,都可以相互交換數據。
WebService
就是一個應用程序向外界暴露出一個能通過Web
進行調用的API
,也就是說能用編程的方法通過Web
來調用這個應用程序
WebService
是建立可互操作的分佈式應用程序的新平臺,是一個平臺,是一套標準。
WebService
平臺需要一套協議來實現分佈式應用程序的創建。
WebService
是一種跨編程語言和跨操作系統平臺的遠程調用技術。
No.2 WebService
技術原理
XML
+XSD
,SOAP
和WSDL
就是構成WebService
平臺的三大技術。
2.1、XML+XSD
WebService
採用HTTP
協議傳輸數據,採用XML
格式封裝數據(即XML
中說明調用遠程服務對象的哪個方法,傳遞的參數是什麼,以及服務對象的返回結果是什麼)。
XML
是WebService
平臺中表示數據的格式。
XML
除了易於建立和易於分析外,其主要的優點在於它既是平臺無關的,又是廠商無關的。
XML
解決了數據表示的問題,但它沒有定義一套標準的數據類型,更沒有說怎麼去擴展這套數據類型。
XML
Schema
(XSD
)定義了一套標準的數據類型,並給出了一種語言來擴展這套數據類型。WebService
平臺就是用XSD來作爲其數據類型系統的。
2.2、SOAP
WebService
通過HTTP
協議發送請求和接收結果時,發送的請求內容和結果內容都採用XML
格式封裝,並增加了一些特定的HTTP
消息頭,以說明HTTP
消息的內容格式,這些特定的HTTP
消息頭和XML
內容格式就是SOAP
協議。
SOAP
提供了標準的RPC
方法來調用WebService
。
SOAP
協議 = HTTP
協議 + XML
數據格式
SOAP
協議定義了SOAP
消息的格式,SOAP
協議是基於HTTP
協議的,SOAP
也是基於XML
和XSD
的,XML
是SOAP
的數據編碼方式。
2.3、WSDL
WebService
客戶端要調用一個WebService
服務,首先要有知道這個服務的地址在哪,以及這個服務裏有什麼方法可以調用,所以WebService
務器端首先要通過一個WSDL
文件來說明自己提供哪些服務可以對外調用,服務是什麼(服務中有哪些方法,方法接受的參數是什麼,返回值是什麼),服務的網絡地址用哪個url
地址表示,服務通過什麼方式來調用。
WSDL
(Web Services Description Language)是一個基於XML
的語言,用於描述WebService
及其函數、參數和返回值。它是WebService
客戶端和服務器端都能理解的標準格式。
WSDL
文件保存在Web服務器上,通過一個url
地址就可以訪問到它。
客戶端要調用一個WebService
服務之前,要知道該服務的WSDL
文件的地址。
WebService
服務提供商可以通過兩種方式來暴露它的WSDL
文件地址:
1.註冊到UDDI
服務器,以便被人查找;
2.直接告訴給客戶端調用者。
No.3 WebService
實現方式
WebService
的三種常用實現方式有:
RPC:遠程過程調用方式(面向方法)
SOA:面向服務的方式(面向消息)
REST:Representational
state
transfer
表述性狀態轉移(面向資源)
3.1、Apache Axis2 技術
Axis2
是一套嶄新的WebService
引擎,該版本是對Axis1.x
重新設計的產物。Axis2
不僅支持SOAP1.1
和SOAP1.2
,還集成了非常流行的REST
WebService
,同時還支持Spring
、JSON
等技術。
這些都將在後面的系列教程中講解。在本文中主要介紹瞭如何使用Axis2
開發一個不需要任何配置文件的WebService
,並在客戶端使用Java
和C#
調用這個WebService
。
3.2、Apache CXF框架
Apache CXF
是一個開源的Services
框架,CXF
幫助您來構建和開發Services
,這些Services
可以支持多種協議,比如:SOAP、POST/HTTP、RESTful HTTP CXF
大大簡化了Service
可以天然地和Spring
進行無縫集成。
CxF
是Celtrix
(ESB
框架)和XFire
(webserivice
) 合併而成,並且捐給了apache
。
CxF
的核心是org.apache.cxf.Bus
(總線),類似於Spring
的 ApplicationContext
。
CXF
默認是依賴於Spring
的。
Apache CXF
發行包中的jar
,如果全部放到lib
中,需要JDK1.6
及以上,否則會報JAX-WS
版本不一致的問題。
CXF
內置了Jetty
服務器,它是servlet
容器,好比tomcat
。
CXF特點
與Spring、Servlet
做了無縫對接,cxf
框架裏面集成了Servlet
容器Jetty
支持註解的方式來發布WebService
能夠顯示一個WebService
的服務列表
能夠添加攔截器:輸入攔截器、輸出攔截器:
輸入日誌信息攔截器、輸出日誌攔截器、用戶權限認證的攔截器
CXF與Spring集成
建立一個web
項目。
準備所有jar
包,將CXF_HOMElib
項目下的所有jar
包,全部都拷貝新項目的lib
目錄下.其中裏面已經包含了Sring3.0
的jar
包,其中jetty
服務器的包可以不要,因爲我們可以部署在tomcat
服務器中。
在web.xml
中配置cxf
的核心servlet,CXFServlet
此配置文件的作用類攔截/ws/*
的所有請求,類似Struts2
的過濾器。
@WebService 標記表示該接口是一個WebService
服務
@WebMethod 表示表示以下方法爲WebService
服務中的方法,exclude=true
表示該方法不被髮布出去
@WebParam 表示方法中的參數
示例程序:
新建一個maven工程
添加依賴
編寫實體類
編寫服務接口
編寫服務接口實現類
編寫spring的配置
編寫web.xml的配置
瀏覽器訪問
結果
出現如下結果,則表明服務發佈成功。
3.3、Jersey
Jersey RESTful WebService
框架是一個開源的、產品級別的JAVA
框架,支持JAX-RS API
並且是一個JAX-RS
(JSR 311
和 JSR 339
)的參考實現。
Jersey
不僅僅是一個JAX-RS
的參考實現,Jersey
提供自己的API
,其API
繼承自JAX-RS
,提供更多的特性和功能以進一步簡化RESTful service
和客戶端的開發。
@Path 用來爲資源類或方法定義URI
,當然除了靜態URI
也支持動態URI
@PathParam 用來將請求URI
的一部分作爲方法參數傳入方法中,對URI
的動態部分,可以自定義校驗正則表達式,如果請求參數校驗失敗,容器返回404 Not Found
@GET 表明被註解的方法響應HTTP GET
請求,@POST
、@PUT
和@DELETE
同理
@Consumes 定義請求的媒體類型,如果不指定,則容器默認可接受任意媒體類型,容器負責確認被調用的方法可接受HTTP
請求的媒體類型,否則返回415 Unsupported Media Type
@Produces 定義響應媒體類型,如果不指定,則容器默認可接受任意媒體類型,容器負責確認被調用的方法可返回HTTP
請求可以接受媒體類型,否則返回406 Not Acceptable
@QueryParam 用來指定方法的參數。
@Context 將信息注入請求或響應相關的類,可注入的類有:Application
,UriInfo
,Request
,HttpHeaders
和SecurityContext
。
@Singleton 和 @PerRequest 默認情況下,資源類的生命週期是per-request
,也就是系統會爲每個匹配資源類URI
的請求創建一個實例,這樣的效率很低,可以對資源類使用@Singleton
註解,這樣在應用範圍內,只會創建資源類的一個實例
示例程序:
新建一個maven工程
添加依賴
編寫對外服務類
編寫一個測試啓動類
在瀏覽器中訪問:
服務端打印信息:
說明:
一般情況下,我們會建一個web
項目並在web.xml
文件中配置一個servlet
容器來處理請求,具體如下:
No.4 適用場景
1、跨防火牆通信
如果應用程序有成千上萬的用戶,而且分佈在世界各地,那麼客戶端和服務器之間的通信將是一個棘手的問題。因爲客戶端和服務器之間通常會有防火牆或者代理服 務器。在這種情況下,使用DCOM
就不是那麼簡單,通常也不便於把客戶端程序發佈到數量如此龐大的每一個用戶手中。傳統的做法是,選擇用瀏覽器作爲客戶 端,寫下一大堆ASP
頁面,把應用程序的中間層暴露給最終用戶。這樣做的結果是開發難度大,程序很難維護。如果中間層組件換成WebService
的話, 就可以從用戶界面直接調用中間層組件。從大多數人的經驗來看,在一個用戶界面和中間層有較多交互的應用程序中,使用WebService
這種結構,可以節 省花在用戶界面編程上20%的開發時間。
2、應用程序集成
企業級的應用程序開發者都知道,企業裏經常都要把用不同語言寫成的、在不同平臺上運行的各種程序集成起來,而這種集成將花費很大的開發力量。應用程序經常 需要從運行在IBM
主機上的程序中獲取數據;或者把數據發送到主機或UNIX
應用程序中去。即使在同一個平臺上,不同軟件廠商生產的各種軟件也常常需要集成起來。通過WebService
,可以很容易的集成不同結構的應用程序。
3、B2B集成
用WebService
集成應用程序,可以使公司內部的商務處理更加自動化。跨公司的商務交易集成通常叫做B2B
集成。WebService
是B2B
集成成功的關鍵。
通過WebService
,公司可以把關鍵的商務應用“暴露”給指定的供應商和客戶。例如,把電子下單系統和電子票系統“暴露”出來,客戶就可以以電子的方式發送訂單,供應商則可以以電子的方式發送原料採購票。WebService
只是B2B
集成的一個關鍵部分,還需要許多其它的部分才能實現集成。
用WebService
來實現B2B
集成的最大好處在於可以輕易實現互操作性。只要把商務邏輯“暴露”出來,成爲WebService
,就可以讓任何指定 的合作伙伴調用這些商務邏輯,而不管他們的系統在什麼平臺上運行,使用什麼開發語言。這樣就大大減少了花在B2B
集成上的時間和成本,讓許多原本無法承受EDI
的中小企業也能實現B2B
集成。
4、軟件和數據重用
軟件重用是一個很大的主題,重用的形式很多,重用的程度有大有小。最基本的形式是源代碼模塊或者類一級的重用,一種形式是二進制形式的組件重用。
採用WebService
應用程序可以用標準的方法把功能和數據“暴露”出來,供其它應用程序使用,達到業務級重用。
·end·