Web Service基礎——規范及三要素


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節點。

  1. 先找Service節點
  2. Service節點中找port節點。每個port對應一個PortType。
  3. Port節點對應一binding節點。每個binding節點對應一個PortType
  4. PortType中有operation 節點就是服務的方法。
  5. operation 中有Input(參數)和output(返回值)
  6. Input(參數)和output(返回值)對應message節點
  7. 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.1soap1.2都是使用post方法
  • 都包括EnvelopeBody

不同之處:

 內容類型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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM