1. Java中的Web Service規范
Java 中共有三種WebService 規范,分別是JAX-WS(JAX-RPC)、JAX-RS、JAXM&SAAJ(廢棄)。
1.1 JAX-WS規范
JAX-WS 的全稱為Java API for XML-Based Webservices ,早期的基於SOAP 的JAVA 的Web 服務規范JAX-RPC(Java API For XML-Remote Procedure Call)目前已經被JAX-WS 規范取代。從java5開始支持JAX-WS2.0版本,Jdk1.6.0_13以后的版本支持2.1版本,jdk1.7支持2.2版本。
- 采用標准SOAP(Simple Object Access Protocol) 協議傳輸,soap屬於w3c標准。Soap協議是基於http的應用層協議,soap協議傳輸是xml數據。
- 采用wsdl作為描述語言即webservice使用說明書,wsdl屬w3c標准。
- xml是webservice的跨平台的基礎,XML主要的優點在於它既與平台無關,又與廠商無關。
- XSD,W3C為webservice制定了一套傳輸數據類型,使用xml進行描述,即XSD(XML Schema Datatypes),任何編程語言寫的webservice接口在發送數據時都要轉換成webservice標准的XSD發送。
1.2 JAX-RS規范
JAX-RS 是JAVA 針對REST(Representation State Transfer)風格制定的一套Web 服務規范,由於推出的較晚,該規范(JSR 311,目前JAX-RS 的版本為1.0)並未隨JDK1.6 一起發行。
支持JAX-RS服務規范的框架有:
- CXF——XFire和Celtix的合並(一個由IONA贊助的開源ESB,最初寄存在ObjectWeb上)。
- Jersey——Sun公司的JAX-RS參考實現。
- RESTEasy——JBoss的JAX-RS項目。
- Restlet——也許是最早的REST框架了,它JAX-RS之前就有了。
注:REST 是一種軟件架構模式,只是一種風格,rest服務采用HTTP 做傳輸協議。
2. Web Service三要素(基於JAX-WS規范)
Web Service規范了體系中的各種關鍵技術,包括服務描述、發布、發現以及消息傳輸等,參考模型如圖所示。
其中最重要的三要素如下:
- WSDL: 用來描述如何訪問具體的服務。
- SOAP: 基於HTTP協議,采用XML格式,用來傳遞信息的格式。
- UDDI: 用戶自己可以按UDDI標准搭建UDDI服務器,用來管理,分發,查詢WebService 。其他用戶可以自己注冊發布WebService調用。
2.1 WSDL
WSDL(Web Service Description Language/Web服務描述語言)是用XML文檔來描述Web服務的標准,通過WSDL可描述Web服務的三個基本屬性:
- 服務能做什么(服務所提供的操作/方法)
- 如何訪問服務(和服務交互的數據格式以及協議)
- 服務位於何處(與協議相關的服務地址,如URL)
WSDL文檔以端口集合的形式來描述Web服務,WSDL服務描述包含對一組操作和消息的一個抽象定義、綁定到這些操作和消息的一個具體協議、以及一個網絡端點規范。WSDL文檔被分為服務接口(Service Interface/抽象)定義和服務實現(Service Implementation/具體實現)定義,WSDL基本結構如圖所示。
2.1.1 WSDL文檔中主要元素:
抽象定義
- Types:定義Web服務使用的所有數據類型集合,可被元素的各消息部件所引用。
- Messages:通信消息數據結構的抽象類型化定義。使用Types所定義的類型來定義整個消息的數據結構,包括函數參數或文檔描述。
- PortTypes:引用消息部分中消息定義來描述函數簽名(操作名、輸入參數、輸出參數)。
具體定義
- Operation:對服務中操作的抽象描述。一個Operation描述了一個訪問入口的請求/響應消息對。
- Bindings:portType部分的操作在此綁定實現,包含了如何將抽象接口的元素轉變為具體表示的細節。
- Port:定義為協議/數據格式綁定與具體Web訪問地址組合的單個服務訪問點。
- Services:確定每個綁定的端口地址。
portType、message和type描述了Web服務是什么,binding描述了如何使用Web服務,port和service描述了Web服務的位置。
2.1.2 WSDL閱讀方法
是從下往上讀,每個wsdl有且只有一個Service節點。
- 先找Service節點
- Service節點中找port節點。每個port對應一個PortType。
- Port節點對應一binding節點。每個binding節點對應一個PortType
- PortType中有operation 節點就是服務的方法。
- operation 中有Input(參數)和output(返回值)
- Input(參數)和output(返回值)對應message節點
- Message對應element節點。Element節點對應complexType節點描述了參數及返回值的數據類型。
2.2 SOAP(通訊協議)
SOAP(Simple Object Access Protocol/簡單文件傳輸協議)是一個輕量的、簡單的、基於XML的協議。使用http發送的XML格式的數據,它可以跨平台,跨防火牆,SOAP不是webservice的專有協議。
2.2.1 SOAP包括四個部分:
- SOAP封裝(envelop),封裝定義了一個描述消息中的內容是什么,是誰發送的,誰應當接受並處理它以及如何處理它們的框架。
- SOAP編碼規則(encoding rules),用於表示應用程序需要使用的數據類型的實例。
- SOAP RPC表示(RPC representation),表示遠程過程調用和應答的協定。
- SOAP綁定(binding),使用底層協議交換信息。
2.2.2 SOAP的基本結構包含以下元素:
- Envelope(必須)標識文檔為SOAP消息,是SOAP的根元素。
- Header(可選)包含頭部信息,如果SOAP消息有Header,則Header必須是Envelope的第一個子元素。
- Body(必須)包含所有的調用和響應信息。
- Fault(可選)提供錯誤消息。
2.2.3 SOAP1.1 & SOAP1.2 協議
目前WebService的協議主要有SOAP1.1和1.2,下面通過查看兩者請求及響應來分析兩者區別:
2.2.3.1 SOAP1.1
請求的協議體
POST /weather HTTP/1.1 Accept: text/xml, multipart/related Content-Type:text/xml; charset=utf-8 SOAPAction:"http://ws.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest" User-Agent: JAX-WS RI 2.2.4-b01 Host: 127.0.0.1:54321 Connection:keep-alive Content-Length: 214 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"> <arg0>北京</arg0> </ns2:queryWeather> </S:Body> </S:Envelope>
響應的協議體
HTTP/1.1 200 OK Transfer-encoding: chunked Content-type: text/xml; charset=utf-8 Date: Thu, 26 Nov 2015 03:14:29 GMT <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"> <return>晴轉多雲</return> </ns2:queryWeatherResponse> </S:Body> </S:Envelope>
2.2.3.2 SOAP1.2
JAX-WS不支持SOAP1.2服務端發布,直接發布會報如下異常
如果要發布SOAP1.2服務端,需要引入2.2.8及以上版本的jax-ws包(jaxws-ri-2.2.8);且在SEI實現類上添加如下注解
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
請求的協議體
POST /weather HTTP/1.1 Accept: application/soap+xml, multipart/related Content-Type: application/soap+xml; charset=utf-8; action="http://ws.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest" User-Agent: JAX-WS RI 2.2.4-b01 Host: 127.0.0.1:54321 Connection: keep-alive Content-Length: 212 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"> <S:Body> <ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"> <arg0>北京</arg0> </ns2:queryWeather> </S:Body> </S:Envelope>
響應的協議體
HTTP/1.1 200 OK Transfer-encoding: chunked Content-type: application/soap+xml; charset=utf-8 Date: Thu, 26 Nov 2015 03:25:24 GMT <?xml version='1.0' encoding='UTF-8'?> <S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"> <S:Body> <ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"> <return>晴轉多雲</return> </ns2:queryWeatherResponse> </S:Body> </S:Envelope>
2.2.3.3 兩者區別
相同之處:
- soap1.1和soap1.2都是使用post方法
- 都包括Envelope和Body
不同之處:
內容類型context-type不同:
- soap1.1使用text/xml
- soap1.2使用application/soap+xml
命名空間Envelope xmlns不同:
2.3 UDDI
UDDI(Universal Description, Discovery and Integration/通用描述、發現和集成)主要提供基於Web服務的注冊和發現機制,為Web服務提供三個重要的技術支持:
- 標准、透明、專門描述Web服務的機制。
- 調用Web服務的機制。
- 可以訪問的Web服務注冊中心。
但是使用webservice並不是必須使用UDDI,因為用戶通過WSDL知道了web service的地址,可以直接通過WSDL調用webservice。