原文地址: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 Service的sayHello入口類型是請求/響應模式,請求消息是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>
