Web服务描述语言(Web Services Description Language, WSDL)描述服务提供者的联系点,也就是服务端点(service endpoint)。它提供了对接口的定义(即希望与服务提供者通信的请求者所要知道如何准确构造请求消息的信息)并且建立了服务的地址(物理位置)。
WSDL由两类描述组成:
l 抽象描述
l 具体描述
WSDL的整体结构,如下图:
definitions是每个WSDL文档的根元素或是父元素。它定义了WSDL文档中使用的很多命名空间的引用。
<definitions name = “Employ”
targetNamespace = “http: //www.xmltc.com/tls/employ/wsdl”
xmlns = “http: //schema.xmlsoap.org/wsdl”
xmlns: act = “http: //www.xmltc.com/tls/employee/schema/eccounting”
xmlns: tns = “http: //www.xmltc.com/tls/employee/wsdl”
........>
</definitions>
Definitions示例
示例中服务被赋予名称”Employployee”而且声明了许多命名空间。其中“http: //schema.xmlsoap.org/wsdl”是默认的命名空间。
1 抽象描述
抽象描述建立了Web服务的接口特征,并且独立于具体的Web服务消息传输技术。通过对接口的抽象,使得不管底层技术平台发生任何改变,都能在不改动借口描述的前提下保护服务描述的完整性。
抽象定义包括类型(types)、消息(message)和端口类型(portType)等部分。
types元素
types结构是XSD schema内容放置的地方。这部分WSDL可以构成实际的XSD schema标记(整个schema结构包含类型定义),或者它包含import元素能够引用外部的schema定义(或它还可以包含嵌入的和导入的XSD类型)。
在这个部分WSDL定义中建立的类型用于表示消息体的XML内容。Message元素引用到这些类型并且关联到消息。
SOAP消息体包含XML内容,表示从简单的参数数据到复杂的业务文件的任何事物。该内容主要是引用WSDL文档中的types模块中定义和声明的类型。从而types中一般要提供XSD schema complexType元素,以便组成相关的类型来表示整个消息体结构。
在以下示例中,将schema结构嵌入到了WSDL types结构。
<types>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace=
"http://www.xmltc.com/railo/transform/schema"/>
<complexType name="ReturnCodeType">
<sequence>
<element name="Code" type="xsd:integer"/>
<element name="Message" type="xsd;string"/>
</sequence>
</complexType>
</types>
示例:types结构中包含了complexType的XSD schema结构
在WSDL中types不是必需的元素,本地的XSD schema类型可以在message元素中直接引用。
Message元素和part元素
服务间的交互是通过消息的接受和传输,很自然要加入message结构。该元素为消息声明一个名称并包含一个或多个part子元素,它们每一个都被赋予一个类型。Message元素随后和operation元素相关联以建立操作的输入和输出消息。
Part元素使用types或element属性来识别消息部分的数据类型。可以将types属性赋予简单类型或者复杂类型且一般用于RPC消息交换模式(MEP)。在基于文档的消息交换模式中part元素通常取决于element属性,它可以引用XSD element元素。name属性是唯一用于识别message结构中的部分元素。
<message name="getEmployeeWeeklyHoursRequestMessage">
<part name="RequestParameter"
element="act:EmployeeHoursRequestType"/>
</message>
<message name="getEmployWeeklyHoursRequestMessage">
<part name="ResponseMessage"
element="act:EmployeeHoursResponseType">
</message>
示例:message和part结构
portType、interface与operation元素
服务操作在WSDL定义的portType区域中定义。因此portType结构就可以理解为服务的操作集。其中单个操作用operation元素来定义。
在Web服务描述语言的1.1版本中定义有portType元素。该规范的2.0版本将元素的名称更改为interface。
Input与output元素
每个operation结构都包含有input与/或output子元素,用来表示操作能够处理的请求和响应消息。
在下列示例中,每个操作都具有一个输入/输出消息。在message元素中,各自的input与output元素通过其message属性被赋予在message结构中定义的消息。
<operation name="GetWeeklyHourLimit">
<input message="tns:getWeeklyHoursRequestMessage"/>
<output message="tns:getWeeklyHoursResponseMessage"/>
</operation>
示例:operation元素与子元素input和output
WSDL支持预定义的消息交换模式(MEP)。Input和output元素的存在以及它们所呈现的顺序通常建立了操作MEP。
需要注意的是:请求和响应与输入和输出消息的顺序相关联,这是基于服务请求的初始化来考虑的。对服务提供者而言,WSDL定义表示一种接口。对WSDL而言,请求-响应MEP意味着请求者将会发送给服务提供者一条请求作为输入,服务提供者将回复一条消息响应作为输出。
2 具体描述
Binding元素
binding元素赋予了可用于WSDL访问和交互的通信协议。Binding元素与portType在结构上是类似的。Binding元素与portType在结构上是类似的。与portType一样,binding结构包含了一个或多个operation元素。然而,在portType中还有soap:binding与soap:operation元素。这些以soap为前缀的元素表明WSDL是以SOAP协议为方式来与之通信的。
<binding name="EmployeeBinding" type="tns:EmployInterface">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http">
<operation name="GetWeeklyHoursLimit">
<soap:operation soapAction="...."/>
...
</operation>
</binding>
示例:binding结构
soap:binding元素的style属性定义了,用于支持操作的SOAP消息是否要作为文档或RPC风格的消息格式化。值”document”允许SOAP消息体包含完整的可定义的XML文档结构。值”rpc”需要遵从SOAP规范中定义的消息体结构,这主要是要求消息体的根元素在操作名称之后命名。
Binding中的input和output元素
每个binding结构中的operation元素都反映了在抽象定义中所定义的input和output消息子元素。但是在这里没有再次引用message元素,却包含了如何建立有所选的通信技术处理和解释消息的协议细节。
<binding name="EmployeeBinding" type="tns:EmployInterface">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http">
<operation name="GetWeeklyHoursLimit">
<soap:operation soapAction="...."/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="UpdateHistory">
<soap:operation soapAction="...">
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
示例:提供消息处理信息的input与output元素
use属性定义了由SOAP处理这所使用的数据类型系统,可选值为”encode”或”literal”。
Service、port与endport元素
Service元素借助包含位置信息的port元素,简单地提供了服务能够访问到的物理地址。
<service name="EmployService">
<port binding="tns:EmployeeBinding" name="EmployeePort">
<soap:address location="http://www.xmltc.com/tls/employee/"/>
</port>
</service>
示例:service与port元素
由于绑定了SOAP协议,所以port元素包含了一个具有物理地址信息的soap:address子元素。在WSDL规范2.0中,port元素由endpoint元素所替代。
Impot和document元素
通过使用导入语句(import元素)链接包含定义服务信息的独立文件(部分WSDL和XSD sxhema),能够在运行时动态加载WSDL服务描述。这允许你能够在WSDL文件之间共享的类型、操作与绑定的模块进行定义。这也允许你引用任何已经设计好的XSD schema模块。
<import namespace="http://www.xmltc.com/tls/schemas"
location="http://www.xmltc.com/tls/schemas/employee.xsd"/>
示例:import元素
Document是个可选元素,允许在WSDL定义中简单地添加可读的描述性注释。开发者在构建服务请求者时使用该信息,或者可通过服务注册以编程的方式读取,从而来帮助发现服务。