學習 WebService 第二步:知識准備——WSDL文件解析


原文地址:https://www.cnblogs.com/yzw23333/p/7245104.html

 

Web service中一個 WSDL 對應一個 web service地址

可以想象成一個商店,商店里面出售很多手機(portTypes),每個手機上有很多功能(opeations),每個功能對應很多輸入和輸出參數(message)  

  • 這里沒有類,只有端口。portTypes
  • 沒有方法,只有端口里面的操作。opeations
  • 沒有參數,只有傳遞給端口中某個操作的消息。message

 

一、WSDL文件解析

xml文檔第一句:

definitions--WSDL文檔的根元素,該元素的屬性指明了WSDL文檔的名稱name

文檔的目標名字空間targetNamespace,以及WSDL文檔應用的名字空間的速記定義。

它指明了此WebService的名稱為:HelloWorldService

 

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

<wsdl:definitions xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://test.demo1/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloWorldService" targetNamespace="http://test.demo1/">

<wsdl:types>

<xs:schema xmlns:tns="http://test.demo1/" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" targetNamespace="http://test.demo1/" version="1.0">

這部分是數據類型的定義,其中為定義了兩個元素的結構:

  • sayHello(請求參數的類型): 將該元素定義為包含一個字符串string元素(arg0)的復合類型元素。
  • sayHelloResponse(響應參數的類型):  將該元素定義為包含一個字符串string元素(return)的復合類型元素。

其中的name="arg0", name="return"中的“arg0”,“return”是可以指定的,因為HelloWorld輸入輸出參數都是使用的默認的參數名,所以生成的xml是這樣子。

<xs:element name="sayHello" type="tns:sayHello"/>

<xs:element name="sayHelloResponse" type="tns:sayHelloResponse"/>

<xs:complexType name="sayHello">

<xs:sequence>

  <xs:element minOccurs="0" name="arg0" type="xs:string"/>

</xs:sequence>

</xs:complexType>

<xs:complexType name="sayHelloResponse">

<xs:sequence>

  <xs:element minOccurs="0" name="return" type="xs:string"/>

</xs:sequence>

</xs:complexType>

</xs:schema>

</wsdl:types>

其中的name="arg0", name="return"中的“arg0”,“return”是可以指定的,因為HelloWorld輸入輸出參數都是使用的默認的參數名,所以生成的xml是這樣子。

如果HelloWorld接口中的方法修改成

1 public @WebResult(name="responseResult")String sayHello(@WebParam(name="name")String name) ;  
  也就是給輸入參數與返回結果指定一個選定的名字,則生成的xml如下所示:
 1 <xs:complexType name="sayHello">  
 2   <xs:sequence>  3     <xs:element minOccurs="0" name="name" type="xs:string"/>  4   </xs:sequence>   5 </xs:complexType>  6 <xs:complexType name="sayHelloResponse">  7   <xs:sequence>  8     <xs:element minOccurs="0" name="responseResult" type="xs:string"/>  9   </xs:sequence> 10 </xs:complexType> 

 

下面這部分是消息格式的抽象定義,其中定義了兩個消息格式

  • sayHelloResponse( 響應消息格式 ): 由一個消息片斷組成,該消息片斷的名字是parameters,包含的具體元素類型sayHelloResponse
  • sayHello( 請求消息格式 ) : 由一個消息片斷組成,該消息片斷的名字是 parameters,包含的具體元素類型sayHello

<wsdl:message name="sayHelloResponse">

<wsdl:part element="tns:sayHelloResponse" name="parameters">

</wsdl:part>

</wsdl:message>

<wsdl:message name="sayHello">

<wsdl:part element="tns:sayHello" name="parameters">

</wsdl:part>

</wsdl:message>

portType---描述服務邏輯接口operation元素的集合。HelloWorld只有一個操作sayHello.

這部分定義了服務訪問點的調用模式的類型,表明 HelloWorld ServicesayHello入口類型是請求/響應模式請求消息是sayHello,而響應消息是sayHelloResponse

<wsdl:portType name="HelloWorld">

<wsdl:operation name="sayHello">

<wsdl:input message="tns:sayHello" name="sayHello">

</wsdl:input>

<wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse">

</wsdl:output>

</wsdl:operation>

</wsdl:portType>

binding---一個endpoint的實際數據格式說明,一個binding元素定義如何將一個抽象消息映射到一個具體數據格式。該元素指明諸如參數順序,返回值等信息。           

每個被支持的信息格式和信息傳送方式組合,就叫做 binding  (soap:binding 就是用 soap語言通話  )

這段xml定義的操作“sayHello使用的是SoapDocumentProtocol消息格式(style="document")。輸入和輸出參數格式都是“Literal”(use="literal"

<wsdl:binding name="HelloWorldServiceSoapBinding" type="tns:HelloWorld">

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

<wsdl:operation name="sayHello">

<soap:operation soapAction="" style="document"/>

<wsdl:input name="sayHello">

  <soap:body use="literal"/>

</wsdl:input>

<wsdl:output name="sayHelloResponse">

  <soap:body use="literal"/>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>

找到名為“HelloWorldService”的service具體定義如下所示:

service---相關port元素的集合,用戶組織endpoint定義。

port--通過binding和物理地址定義的endpoint,這個元素將所有抽象定義聚集在一起。

這部分是具體的Web服務的定義,在這個名為 HelloWorldService的Web服務中,

提供了一個服務訪問入口訪問地址是"http://localhost:8080/helloWorld",

使用的消息模式是由前面的binding “HelloWorldServiceSoapBindin”所定義的。

<wsdl:service name="HelloWorldService">

  <wsdl:port binding="tns:HelloWorldServiceSoapBinding" name="HelloWorldPort">

    <soap:address location="http://localhost:8080/helloWorld"/>

  </wsdl:port>

</wsdl:service>

</wsdl:definitions>

 

二、請求及響應的具體消息格式解析

 

  • 請求消息

- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://test.demo1/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
- <soapenv:Body>  
- <q0:sayHello>  
  <arg0>xxl</arg0>   
  </q0:sayHello>  
  </soapenv:Body>  
  </soapenv:Envelope>

  • 響應消息

- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
- <soap:Body>  
- <sayHelloResponse xmlns:ns2="http://test.demo1/">  
  <return>hello xxl</return>   
  </sayHelloResponse>  
  </soap:Body>  
  </soap:Envelope>


免責聲明!

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



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