WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。

WSDL 简介


WSDL 是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言。


什么是 WSDL?

  • WSDL 指网络服务描述语言
  • WSDL 使用 XML 编写
  • WSDL 是一种 XML 文档
  • WSDL 用于描述网络服务
  • WSDL 也可用于定位网络服务
  • WSDL 还不是 W3C 标准

WSDL 可描述网络服务(Web Services)

WSDL 指网络服务描述语言 (Web Services Description Language)。
WSDL 是一种使用 XML 编写的文档。这种文档可描述某个 Web service。它可规定服务的位置,以及此服务提供的操作(或方法)。

WSDL 文档


WSDL 文档仅仅是一个简单的 XML 文档。
它包含一系列描述某个 web service 的定义。


WSDL 文档结构

WSDL 文档是利用这些主要的元素来描述某个 web service 的:

元素 定义
web service 执行的操作
web service 使用的消息
web service 使用的数据类型
web service 使用的通信协议

一个 WSDL 文档的主要结构是类似这样的:

  1. <definitions>
  2. <types>
  3. data type definitions........
  4. </types>
  5. <message>
  6. definition of the data being communicated....
  7. </message>
  8. <portType>
  9. set of operations......
  10. </portType>
  11. <binding>
  12. protocol and data format specification....
  13. </binding>
  14. </definitions>

WSDL 文档可包含其它的元素,比如 extension 元素,以及一个 service 元素,此元素可把若干个 web services 的定义组合在一个单一的 WSDL 文档中。


WSDL 端口

_<portType>_ 元素是最重要的 WSDL 元素。
它可描述一个 web service、可被执行的操作,以及相关的消息。
可以把 <portType> 元素比作传统编程语言中的一个函数库(或一个模块、或一个类)。


WSDL 消息

_<message>_ 元素定义一个操作的数据元素。
每个消息均由一个或多个部件组成。可以把这些部件比作传统编程语言中一个函数调用的参数。


WSDL types

_<types>_ 元素定义 web service 使用的数据类型。
为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。


WSDL Bindings

_<binding>_ 元素为每个端口定义消息格式和协议细节。


WSDL 实例

这是某个 WSDL 文档的简化的片段:

  1. <message name="getTermRequest">
  2. <part name="term" type="xs:string"/>
  3. </message>
  4. <message name="getTermResponse">
  5. <part name="value" type="xs:string"/>
  6. </message>
  7. <portType name="glossaryTerms">
  8. <operation name="getTerm">
  9. <input message="getTermRequest"/>
  10. <output message="getTermResponse"/>
  11. </operation>
  12. </portType>

在这个例子中,_<portType>_ 元素把 “glossaryTerms” 定义为某个端口的名称,把 “getTerm” 定义为某个操作的名称。
操作 “getTerm” 拥有一个名为 “getTermRequest” 的输入消息,以及一个名为 “getTermResponse” 的输出消息
_<message>_ 元素可定义每个消息的部件,以及相关联的数据类型。
对比传统的编程,glossaryTerms 是一个函数库,而 “getTerm” 是带有输入参数 “getTermRequest” 和返回参数 getTermResponse 的一个函数。

描述于 W3C 工作草案的完整 WSDL 1.2 语法已列在下面:

  1. <wsdl:definitions name="nmtoken"? targetNamespace="uri">
  2. <import namespace="uri" location="uri"/> *
  3. <wsdl:documentation .... /> ?
  4. <wsdl:types> ?
  5. <wsdl:documentation .... /> ?
  6. <xsd:schema .... /> *
  7. </wsdl:types>
  8. <wsdl:message name="ncname"> *
  9. <wsdl:documentation .... /> ?
  10. <part name="ncname" element="qname"? type="qname"?/> *
  11. </wsdl:message>
  12. <wsdl:portType name="ncname"> *
  13. <wsdl:documentation .... /> ?
  14. <wsdl:operation name="ncname"> *
  15. <wsdl:documentation .... /> ?
  16. <wsdl:input message="qname"> ?
  17. <wsdl:documentation .... /> ?
  18. </wsdl:input>
  19. <wsdl:output message="qname"> ?
  20. <wsdl:documentation .... /> ?
  21. </wsdl:output>
  22. <wsdl:fault name="ncname" message="qname"> *
  23. <wsdl:documentation .... /> ?
  24. </wsdl:fault>
  25. </wsdl:operation>
  26. </wsdl:portType>
  27. <wsdl:serviceType name="ncname"> *
  28. <wsdl:portType name="qname"/> +
  29. </wsdl:serviceType>
  30. <wsdl:binding name="ncname" type="qname"> *
  31. <wsdl:documentation .... /> ?
  32. <-- binding details --> *
  33. <wsdl:operation name="ncname"> *
  34. <wsdl:documentation .... /> ?
  35. <-- binding details --> *
  36. <wsdl:input> ?
  37. <wsdl:documentation .... /> ?
  38. <-- binding details -->
  39. </wsdl:input>
  40. <wsdl:output> ?
  41. <wsdl:documentation .... /> ?
  42. <-- binding details --> *
  43. </wsdl:output>
  44. <wsdl:fault name="ncname"> *
  45. <wsdl:documentation .... /> ?
  46. <-- binding details --> *
  47. </wsdl:fault>
  48. </wsdl:operation>
  49. </wsdl:binding>
  50. <wsdl:service name="ncname" serviceType="qname"> *
  51. <wsdl:documentation .... /> ?
  52. <wsdl:port name="ncname" binding="qname"> *
  53. <wsdl:documentation .... /> ?
  54. <-- address details -->
  55. </wsdl:port>
  56. </wsdl:service>
  57. </wsdl:definitions>

WSDL 端口


元素是最重要的 WSDL 元素。


WSDL 端口

_<portType>_ 元素是最重要的 WSDL 元素。
它可描述一个 web service、可被执行的操作,以及相关的消息。
可以把 <portType> 元素比作传统编程语言中的一个函数库(或一个模块、或一个类)。


操作类型

请求-响应是最普通的操作类型,不过 WSDL 定义了四种类型:

类型 定义
One-way 此操作可接受消息,但不会返回响应。
Request-response 此操作可接受一个请求并会返回一个响应
Solicit-response 此操作可发送一个请求,并会等待一个响应。
Notification 此操作可发送一条消息,但不会等待响应。

One-Way 操作

一个 one-way 操作的例子:

  1. <message name="newTermValues">
  2. <part name="term" type="xs:string"/>
  3. <part name="value" type="xs:string"/>
  4. </message>
  5. <portType name="glossaryTerms">
  6. <operation name="setTerm">
  7. <input name="newTerm" message="newTermValues"/>
  8. </operation>
  9. </portType >

在这个例子中,端口 “glossaryTerms” 定义了一个名为 “setTerm” 的 one-way 操作。
这个 “setTerm” 操作可接受新术语表项目消息的输入,这些消息使用一条名为 “newTermValues” 的消息,此消息带有输入参数 “term” 和 “value”。不过,没有为这个操作定义任何输出。


Request-Response 操作

一个 request-response 操作的例子:

  1. <message name="getTermRequest">
  2. <part name="term" type="xs:string"/>
  3. </message>
  4. <message name="getTermResponse">
  5. <part name="value" type="xs:string"/>
  6. </message>
  7. <portType name="glossaryTerms">
  8. <operation name="getTerm">
  9. <input message="getTermRequest"/>
  10. <output message="getTermResponse"/>
  11. </operation>
  12. </portType>

在这个例子中,端口 “glossaryTerms” 定义了一个名为 “getTerm” 的 request-response 操作。
“getTerm” 操作会请求一个名为 “getTermRequest” 的输入消息,此消息带有一个名为 “term” 的参数,并将返回一个名为 “getTermResponse” 的输出消息,此消息带有一个名为 “value” 的参数。

WSDL 绑定


WSDL 绑定可为 web service 定义消息格式和协议细节。


绑定到 SOAP

一个 请求 - 响应 操作的例子:

  1. <message name="getTermRequest">
  2. <part name="term" type="xs:string"/>
  3. </message>
  4. <message name="getTermResponse">
  5. <part name="value" type="xs:string"/>
  6. </message>
  7. <portType name="glossaryTerms">
  8. <operation name="getTerm">
  9. <input message="getTermRequest"/>
  10. <output message="getTermResponse"/>
  11. </operation>
  12. </portType>
  13. <binding type="glossaryTerms" name="b1">
  14. <soap:binding style="document"
  15. transport="http://schemas.xmlsoap.org/soap/http" />
  16. <operation>
  17. <soap:operation soapAction="http://example.com/getTerm"/>
  18. <input><soap:body use="literal"/></input>
  19. <output><soap:body use="literal"/></output>
  20. </operation>
  21. </binding>
  • _binding_ 元素有两个属性 - name 属性和 type 属性。
  • name 属性定义 binding 的名称,而 type 属性指向用于 binding 的端口,在这个例子中是 “glossaryTerms” 端口。
  • soap:binding 元素有两个属性 - style 属性和 transport 属性。
  • style 属性可取值 “rpc” 或 “document”。在这个例子中我们使用 document。transport 属性定义了要使用的 SOAP 协议。在这个例子中我们使用 HTTP。
  • operation 元素定义了每个端口提供的操作符。
  • 对于每个操作,相应的 SOAP 行为都需要被定义。同时您必须如何对输入和输出进行编码。在这个例子中我们使用了 “literal”。

    WSDL UDDI


UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。
UDDI,英文为 “Universal Description, Discovery and Integration”,可译为”通用描述、发现与集成服务”。