1.定义
WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。
WSDL 指网络服务描述语言
WSDL 使用XML 编写
WSDL 是一种XML 文档
WSDL 用于描述网络服务
WSDL 也可用于定位网络服务
2.文档
WSDL文档包含了一系列描述某个web service 的定义可更容易地描述允许的文档内容
在WSDL1.1中,文档主要包含了以下内容
具有如下基本结构
<definitions>
<types>
data typedefinitions........
</types>
<message>
definition of the data beingcommunicated....
</message>
<portType>
……..
</portType>
<binding>
protocol and data formatspecification....
</binding>
</definitions>
3.具体元素
3.1 WSDL<types>
types元素用作一个容器,用于定义XML模式内置类型中没有描述的各种数据类型。当声明消息部分的有效负载时,消息定义使用了在types元素中定义的数据类型和元素。
例:
<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="qualified" elementFormDefault="qualified"
targetNamespace="http://com.liuxiang.xfireDemo/HelloService">
<xsd:element name="sayHello">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1"
name="name" nillable="true" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="sayHelloResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1"
name="out" nillable="true" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
定义了两个元素,一个是sayHello,一个是sayHelloResponse:
sayHello:定义了一个复杂类型,仅仅包含一个简单的字符串,将来用来描述操作的参入传入部分;
sayHelloResponse:定义了一个复杂类型,仅仅包含一个简单的字符串,将来用来描述操作的返回值;
3.2 WSDL<message>
message元素描述了Web服务使用消息的有效负载。
可以描述输出或者接受消息的有效负载;
还可以描述SOAP文件头和错误detail元素的内容。
定义message元素的方式取决于使用RPC样式还是文档样式的消息传递。
例:
<message name="getTermRequest">
<part name="term" type="xs:string"/>
</message>
<message name="getTermResponse">
<part name="value" type="xs:string"/>
</message>
3.3 WSDL<portType>
元素是最重要的WSDL 元素。
它可描述一个web service、可被执行的操作,以及相关的消息。
可以把 元素比作传统编程语言中的一个函数库(或一个模块、或一个类)。
操作类型如下:
One-Way 操作
例子:
<message name="newTermValues">
<part name="term" type="xs:string"/>
<part name="value" type="xs:string"/>
</message>
<portTypename="glossaryTerms">
<operation name="setTerm">
<input name="newTerm" message="newTermValues"/>
</operation>
</portType>
在这个例子中,端口“glossaryTerms” 定义了一个名为“setTerm” 的one-way 操作。一个operation可以看作是一个方法。
这个"setTerm" 操作可接受新术语表项目消息的输入,这些消息使用一条名为"newTermValues" 的消息,此消息带有输入参数"term" 和"value"。不过,没有为这个操作定义任何输出。
Request-Response 操作
例子:
<message name="getTermRequest">
<part name="term" type="xs:string"/>
</message>
<message name="getTermResponse">
<part name="value" type="xs:string"/>
</message>
<portTypename="glossaryTerms">
<operation name="getTerm">
<input message="getTermRequest"/>
<output message="getTermResponse"/>
</operation>
</portType>
在这个例子中,端口"glossaryTerms" 定义了一个名为"getTerm" 的request-response 操作。
“getTerm” 操作会请求一个名为"getTermRequest" 的输入消息,此消息带有一个名为"term" 的参数,并将返回一个名为"getTermResponse" 的输出消息,此消息带有一个名为"value" 的参数。
3.4 WSDL<binding >
binding元素将一个抽象portType映射到一组具体协议(SOAP和HTTP)、消息传递样式、编码样式。通常binding元素与协议专有的元素和在一起使用
例:
<message name="getTermRequest">
<part name="term" type="xs:string"/>
</message>
<message name="getTermResponse">
<part name="value" type="xs:string"/>
</message>
<portTypename="glossaryTerms">
<operation name="getTerm">
<input message="getTermRequest"/>
<output message="getTermResponse"/>
</operation>
</portType>
<binding type="glossaryTerms" name="b1">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation>
<soap:operation soapAction="http://example.com/getTerm"/>
<input><soap:bodyuse="literal"/></input>
<output><soap:bodyuse="literal"/></output>
</operation>
</binding>
binding 元素有两个属性- name 属性和type 属性。
name 属性定义binding 的名称,而type 属性指向用于binding 的端口,在这个例子中是"glossaryTerms" 端口。
soap:binding 元素有两个属性- style 属性和transport 属性。
style 属性可取值"rpc" 或"document"。在这个例子中使用document。transport 属性定义了要使用的SOAP 协议。在这个例子中使用HTTP。
operation 元素定义了每个端口提供的操作符。
对于每个操作,相应的SOAP 行为都需要被定义。同时您必须如何对输入和输出进行编码。在这个例子中使用了"literal"。
3.5 WSDL<service >
service元素包含一个或者多个port元素,其中每个port元素表示一个不同的Web服务。port元素将URL赋给一个特定的binding,甚至可以使两个或者多个port元素将不同的URL赋值给相同的binding。
例子:
<wsdl:service name="HelloService">
<wsdl:port name="HelloServiceHttpPort"
binding="tns:HelloServiceHttpBinding">
<wsdlsoap:address
location="http://localhost:8080/xfire/services/HelloService/>
</wsdl:port>
</wsdl:service>
3.6 WSDL<import>
import元素使得可以在当前的WSDL文档中使用其他WSDL文档中指定的命名空间中的定义元素。
通常在用户希望模块化WSDL文档的时候,该功能是非常有效果的。
import的格式如下:
<wsdl:importnamespace=“http://xxx.xxx.xxx/xxx/xxx” location=“http://xxx.xxx.xxx/xxx/xxx.wsdl”/>
必须有namespace属性和location属性:
namespace属性:值必须与正导入的WSDL文档中声明的targetNamespace相匹配;
location属性:必须指向一个实际的WSDL文档,并且该文档不能为空。