wsdl学习

本文来自 :迹忆 原文地址:http://www.onmpw.com/tm/xwzj/network_47.html

  在刚开始学习Webservice的时候,发现里面涉及到的知识点还真不少,每一点单拿出来都可以自成一派了。尤其是看到WSDL的时候,查了很长时间的资料,依然是有些迷惑,对其没有一个清晰的认识。随着在以后的工作中,自己写了一些WSDL的案例,才逐渐的对其内部原理有了一些认识。

  首先先看一下WSDL的作用:WSDL(Web Service Description Language)用XML格式的文件来描述可用的Web服务。其实说白了就是一个标准,终端按照这个标准在网络中创建Web服务,客户端也按照此标准去连接这个服务,并且根据WSDL文件获知自己所需要的操作。

  接下来我想说一下WSDL的发展过程,了解WSDL的产生历史,在以后的学习过程中不至于产生迷惑。

  WSDL的第一个版本是WSDL1.0 在2000年9月有IBM,Microsoft以及Ariba开发,目的就是描述Web Service 的SOAP工具包。随后在2001年3月,WSDL 1.1版本发布,此举标志着WSDL走向了正轨。但是在1.0 和1.1之间并没有产生多大的变化。时隔两年,在2003年6月最为W3C的工作草案 WSDL1.2发布。按照W3C的说法,WSDL1.2相对于1.1版本来说开发者使用起来更简单并且更灵活了。但是WSDL1.2并不支持大多数的SOAP服务。在2007年6月,WSDL1.2被正式更名为WSDL2.0,此时WSDL2.0也成为了W3C的推荐版本。做出这一改变的原因是2.0版本相对于1.1版本来说有了实质性的改变,所以上升了一个等级。所以说现在WSDL流行的两个版本是WSDL2.0 和 WSDL1.1。虽说WSDL2.0 是W3C推荐的版本,但是现在大多数的厂商支持的还是WSDL1.1。举个例子来说,我们都知道PHP的一款官方IDE——zendstudio还有java IDE——Eclipse,当我们使用它们新建WSDl文件时,这个WSDl文件所遵循的格式还是WSDL1.1版本的格式。在我平时的工作中,使用的WSDL也是遵循的1.1版本的格式。

  那WSDL1.1和WSDL2.0的格式究竟是怎样的呢,下面我来向大家介绍介绍。

  首先我们看一下WSDL1.1,按照此标准,在WSDL文件中包含下面七项内容

1. Types

  可以认为是一个容器,容器里的内容是数据类型的描述,当然需要借助于XML Schema 来达到这一目的。那么这个容器的格式如下

 1 <wsdl:types>
 2     <xsd:schema targetNamespace="http://www.test.com/WSDLFile/">
 3       <xsd:element name="Operation">
 4         <xsd:complexType>
 5           <xsd:sequence>
 6             <xsd:element name="in" type="xsd:string"/>
 7           </xsd:sequence>
 8         </xsd:complexType>
 9       </xsd:element>
10       <xsd:element name="OperationResponse">
11         <xsd:complexType>
12           <xsd:sequence>
13             <xsd:element name="out" type="xsd:string"/>
14           </xsd:sequence>
15         </xsd:complexType>
16       </xsd:element>
17     </xsd:schema>
18   </wsdl:types>

2. Message

对操作接口进行一个抽象的定义。格式如下:

1 <wsdl:message name="OperationRequest">
2     <wsdl:part element="tns:Operation" name="parameters"/>
3   </wsdl:message>
4 <wsdl:message name="OperationResponse">
5     <wsdl:part element="tns:OperationResponse" name="parameters"/>
6   </wsdl:message>

Messages包含了一个或者多个part 元素,对于Message的属性name的值是唯一的,和当前整个WSDL文件中的人和一个Message的name值都不能相同。Part的属性name的值也是唯一的,和当前Message中的其它的任何一个part的name的值都不能相同,当然处于不同的Message中的part的name的值可以相同。

每一个part元素都关联message-type属性,这个message-type属性一般包含两部分:element和type。Message中的每一个part对应Types中的一个element元素,并且part的element属性的值为 Types中的element的name的值,前面再加上tns: ,举例如下(下面的代码是摘自 http://www.w3.org/TR/wsdl#_introduction):

 1 <types>
 2         <schema .... >
 3            <element name="PO" type="tns:POType"/>
 4            <complexType name="POType">
 5                <all>
 6                    <element name="id" type="string/>
 7                    <element name="name" type="string"/>
 8                    <element name="items">
 9                        <complexType>
10                            <all>
11                                <element name="item" type="tns:Item" minOccurs="0" maxOccurs="unbounded"/>
12                            </all>
13                        </complexType>
14                    </element>
15               </all>
16            </complexType>
17  
18            <complexType name="Item">
19                <all>
20                    <element name="quantity" type="int"/>
21                    <element name="product" type="string"/>
22                </all>
23            </complexType>
24            <element name="Invoice" type="tns:InvoiceType"/>
25            <complexType name="InvoiceType">
26                <all>
27                    <element name="id" type="string"/>
28                </all>
29            </complexType>
30         </schema>
31     </types>
32 <message name="PO">
33         <part name="po" element="tns:PO"/>
34         <part name="invoice" element="tns:Invoice"/>
35     </message>

对于Message这一项在WSDL2.0中已经去掉了。

3. Port Type

由终端定义的一系列的抽象方法,其格式如下  

1 <wsdl:portType name="WSDLFile">
2     <wsdl:operation name="Operation">
3       <wsdl:input message="tns:OperationRequest"/>
4       <wsdl:output message="tns:OperationResponse"/>
5     </wsdl:operation>
6 </wsdl:portType>
原文地址:https://www.cnblogs.com/xiayahui/p/5659415.html