WSDL - 快速指南


WSDL - 简介

WSDL 代表 Web 服务描述语言。它是描述 Web 服务的标准格式。WSDL 由 Microsoft 和 IBM 联合开发。

WSDL 的特点

  • WSDL 是一种基于 XML 的协议,用于在去中心化和分布式环境中进行信息交换。

  • WSDL 定义描述如何访问 Web 服务以及它将执行哪些操作。

  • WSDL 是一种用于描述如何与基于 XML 的服务进行交互的语言。

  • WSDL 是通用描述、发现和集成 (UDDI) 的一个组成部分,UDDI 是一个基于 XML 的全球商业注册中心。

  • WSDL 是 UDDI 使用的语言。

  • WSDL 发音为“wiz-dull”,拼写为“WSDL”。

WSDL 用法

WSDL 通常与 SOAP 和 XML Schema 结合使用,通过 Internet 提供 Web 服务。连接到 Web 服务的客户端程序可以读取 WSDL 以确定服务器上可用的功能。使用的任何特殊数据类型都以 XML 模式的形式嵌入到 WSDL 文件中。然后,客户端可以使用 SOAP 实际调用 WSDL 中列出的函数之一。

WSDL 的历史

WSDL 1.1 由 Ariba、IBM 和 Microsoft 于 2001 年 3 月作为 W3C 注释提交,用于描述 XML 协议上的 W3C XML 活动的服务。

WSDL 1.1 尚未得到万维网联盟 (W3C) 的认可,但它刚刚发布了 2.0 版本的草案,该草案将成为推荐标准(官方标准),因此得到了 W3C 的认可。

WSDL - 元素

WSDL 将 Web 服务分解为三个特定的、可识别的元素,这些元素一旦定义就可以组合或重用。

可以单独定义的 WSDL 的三个主要元素是 -

  • 类型
  • 运营
  • 捆绑

WSDL 文档具有各种元素,但它们包含在这三个主要元素中,可以将它们开发为单独的文档,然后可以将它们组合或重用以形成完整的 WSDL 文件。

WSDL 元素

WSDL 文档包含以下元素 -

  • 定义- 它是所有 WSDL 文档的根元素。它定义了 Web 服务的名称,声明了文档其余部分使用的多个命名空间,并包含此处描述的所有服务元素。

  • 数据类型- 消息中使用的数据类型采用 XML 模式的形式。

  • 消息- 它是数据的抽象定义,以消息的形式呈现为整个文档或映射到方法调用的参数。

  • 操作- 它是消息操作的抽象定义,例如命名将接受和处理消息的方法、消息队列或业务流程。

  • 端口类型- 它是映射到一个或多个端点的一组抽象操作,定义绑定的操作集合;操作的集合是抽象的,可以通过各种绑定映射到多个传输。

  • 绑定- 它是为特定端口类型定义的操作和消息的具体协议和数据格式。

  • 端口- 它是绑定和网络地址的组合,提供服务通信的目标地址。

  • 服务- 它是包含文件中服务定义的相关端点的集合;服务将绑定映射到端口并包含任何可扩展性定义。

除了这些主要元素之外,WSDL 规范还定义了以下实用元素 -

  • 文档- 该元素用于提供人类可读的文档,并且可以包含在任何其他 WSDL 元素中。

  • Import - 此元素用于导入其他 WSDL 文档或 XML 模式。

注意- WSDL 部分通常是使用 Web 服务感知工具自动生成的。

WSDL 文档结构

WSDL 文档的主要结构如下所示:

<definitions>
   <types>
      definition of types........
   </types>

   <message>
      definition of a message....
   </message>

   <portType>
      <operation>
         definition of a operation.......  
      </operation>
   </portType>

   <binding>
      definition of a binding....
   </binding>

   <service>
      definition of a service....
   </service>
</definitions>

WSDL 文档还可以包含其他元素,例如扩展元素和服务元素,从而可以将多个 Web 服务的定义组合到一个 WSDL 文档中。

继续进一步分析WSDL文档的一个例子。

WSDL - 示例

下面给出了一个 WSDL 文件,用于演示简单的 WSDL 程序。

让我们假设该服务提供一个公开可用的函数,称为sayHello。该函数需要一个字符串参数并返回一个字符串问候语。例如,如果您传递参数world,则服务函数sayHello将返回问候语“Hello, world!”。

例子

HelloService.wsdl 文件的内容 -

<definitions name = "HelloService"
   targetNamespace = "http://www.examples.com/wsdl/HelloService.wsdl"
   xmlns = "http://schemas.xmlsoap.org/wsdl/"
   xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns:tns = "http://www.examples.com/wsdl/HelloService.wsdl"
   xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
 
   <message name = "SayHelloRequest">
      <part name = "firstName" type = "xsd:string"/>
   </message>
	
   <message name = "SayHelloResponse">
      <part name = "greeting" type = "xsd:string"/>
   </message>

   <portType name = "Hello_PortType">
      <operation name = "sayHello">
         <input message = "tns:SayHelloRequest"/>
         <output message = "tns:SayHelloResponse"/>
      </operation>
   </portType>

   <binding name = "Hello_Binding" type = "tns:Hello_PortType">
      <soap:binding style = "rpc"
         transport = "http://schemas.xmlsoap.org/soap/http"/>
      <operation name = "sayHello">
         <soap:operation soapAction = "sayHello"/>
         <input>
            <soap:body
               encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
               namespace = "urn:examples:helloservice"
               use = "encoded"/>
         </input>
		
         <output>
            <soap:body
               encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
               namespace = "urn:examples:helloservice"
               use = "encoded"/>
         </output>
      </operation>
   </binding>

   <service name = "Hello_Service">
      <documentation>WSDL File for HelloService</documentation>
      <port binding = "tns:Hello_Binding" name = "Hello_Port">
         <soap:address
            location = "http://www.examples.com/SayHello/" />
      </port>
   </service>
</definitions>

实例分析

  • 定义- HelloService

  • 类型- 使用内置数据类型,它们在 XMLSchema 中定义。

  • 消息-

    • sayHelloRequest - 名字参数

    • sayHelloresponse - 问候语返回值

  • 端口类型- sayHello 操作由请求和响应服务组成。

  • 绑定- 使用 SOAP HTTP 传输协议的方向。

  • 服务- 服务可在 http://www.examples.com/SayHello/ 获得

  • 端口- 将绑定与可以访问正在运行的服务的 URI http://www.examples.com/SayHello/ 相关联。

WSDL - <定义> 元素

<definitions>元素必须是所有WSDL文档的根元素。它定义 Web 服务的名称。

这是上一章中使用定义元素的代码片段。

<definitions name="HelloService"
   targetNamespace="http://www.examples.com/wsdl/HelloService.wsdl"
   xmlns="http://schemas.xmlsoap.org/wsdl/"
   xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns:tns="http://www.examples.com/wsdl/HelloService.wsdl"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   ................................................
</definitions>

从上面的例子中,我们可以得出结论:定义-

  • 是所有其他元素的容器。

  • 指定该文档名为HelloService

  • 指定targetNamespace属性。targetNamespace是 XML 模式的约定,它使 WSDL 文档能够引用自身在此示例中,我们指定了http://www.examples.com/wsdl/HelloService.wsdl 的targetNamespace

  • 指定默认命名空间:xmlns=http://schemas.xmlsoap.org/wsdl/。因此,所有没有命名空间前缀的元素(例如messageportType)都被假定为默认 WSDL 命名空间的一部分。

  • 指定在文档的其余部分中使用的大量名称空间。

注意- 命名空间规范不要求文档出现在给定位置。重要的一点是,您指定一个唯一的值,该值与定义的所有其他命名空间不同。

WSDL - <types> 元素

Web 服务需要定义其输入和输出以及它们如何映射到服务和从服务中映射出来。WSDL <types>元素负责定义 Web 服务使用的数据类型。类型是 XML 文档或文档部分。

  • types元素描述客户端和服务器之间使用的所有数据类型

  • WSDL 并不专门依赖于特定的打字系统。

  • WSDL 使用 W3C XML Schema 规范作为定义数据类型的默认选择。

  • 如果服务仅使用 XML Schema 内置的简单类型(例如字符串和整数),则不需要types元素。

  • WSDL 允许在单独的元素中定义类型,以便这些类型可以在多个 Web 服务中重用。

这是摘自 W3C 规范的一段代码。此代码描述了如何在 WSDL 中使用类型元素。

<types>
   <schema targetNamespace = "http://example.com/stockquote.xsd"
      xmlns = "http://www.w3.org/2000/10/XMLSchema">
		
      <element name = "TradePriceRequest">
         <complexType>
            <all>
               <element name = "tickerSymbol" type = "string"/>
            </all>
         </complexType>
      </element>
		
      <element name = "TradePrice">
         <complexType>
            <all>
               <element name = "price" type = "float"/>
            </all>
         </complexType>
      </element>
		
   </schema>
</types>

数据类型解决了识别您打算在 Web 服务中使用的数据类型和格式的问题。类型信息在发送方和接收方之间共享。因此,消息的接收者需要访问您用于对数据进行编码的信息,并且必须了解如何对数据进行解码。

WSDL - <消息> 元素

<message>元素描述 Web 服务提供商和消费者之间交换的数据

  • 每个 Web 服务都有两个消息:输入和输出。

  • 输入描述 Web 服务的参数,输出描述来自 Web 服务的返回数据。

  • 每条消息包含零个或多个<part>参数,每个参数对应 Web 服务功能的一个参数。

  • 每个<part>参数都与<types>容器元素中定义的具体类型相关联。

让我们从 WSDL 示例章节中获取一段代码 -

<message name = "SayHelloRequest">
   <part name = "firstName" type = "xsd:string"/>
</message>

<message name = "SayHelloResponse">
   <part name = "greeting" type = "xsd:string"/>
</message>

这里,定义了两个消息元素。第一个表示请求消息SayHelloRequest,第二个表示响应消息SayHelloResponse

这些消息中的每一个都包含一个单独的部分元素。对于请求,该部分指定了函数参数;在本例中,我们指定一个firstName参数。对于响应,该部分指定函数返回值;在本例中,我们指定单个问候语返回值。

WSDL - <portType> 元素

<portType>元素组合多个消息元素以形成完整的单向或往返操作

例如,<portType>可以将一个请求和一个响应消息组合成一个请求/响应操作。这在 SOAP 服务中最常用。一个 portType 可以定义多个操作。

让我们从 WSDL 示例章节中获取一段代码 -

<portType name = "Hello_PortType">
   <operation name = "sayHello">
      <input message = "tns:SayHelloRequest"/>
      <output message = "tns:SayHelloResponse"/>
   </operation>
</portType>
  • portType 元素定义一个名为sayHello的操作。

  • 该操作由单个输入消息SayHelloRequest

  • 输出消息SayHelloResponse

运作模式

WSDL 支持四种基本操作模式 -

单程

该服务接收一条消息。因此,该操作具有单个输入元素。单向操作的语法是 -

<wsdl:definitions .... > 
   <wsdl:portType .... > *
      <wsdl:operation name = "nmtoken">
         <wsdl:input name = "nmtoken"? message = "qname"/>
      </wsdl:operation>
   </wsdl:portType >
</wsdl:definitions>

请求-响应

该服务接收消息并发送响应。因此,该操作具有一个输入元素,后面跟着一个输出元素。为了封装错误,还可以指定可选的故障元素。请求-响应操作的语法是 -

<wsdl:definitions .... >
   <wsdl:portType .... > *
      <wsdl:operation name = "nmtoken" parameterOrder = "nmtokens">
         <wsdl:input name = "nmtoken"? message = "qname"/>
         <wsdl:output name = "nmtoken"? message = "qname"/>
         <wsdl:fault name = "nmtoken" message = "qname"/>*
      </wsdl:operation>
   </wsdl:portType>
</wsdl:definitions>

征求-回应

该服务发送消息并接收响应。因此,该操作具有一个输出元素,后面跟着一个输入元素。为了封装错误,还可以指定可选的故障元素。请求-响应操作的语法是 -

<wsdl:definitions .... >
   <wsdl:portType .... > *
      <wsdl:operation name = "nmtoken" parameterOrder = "nmtokens">
         <wsdl:output name = "nmtoken"? message = "qname"/>
         <wsdl:input name = "nmtoken"? message = "qname"/>
         <wsdl:fault name = "nmtoken" message = "qname"/>*
      </wsdl:operation>
   </wsdl:portType >
</wsdl:definitions>

通知

该服务发送一条消息。因此,该操作具有单个输出元素。以下是通知操作的语法 -

<wsdl:definitions .... >
   <wsdl:portType .... > *
      <wsdl:operation name = "nmtoken">
         <wsdl:output name = "nmtoken"? message = "qname"/>
      </wsdl:operation>
   </wsdl:portType>
</wsdl:definitions>

WSDL - <绑定> 元素

<binding>元素提供有关如何通过线路实际传输portType操作的具体细节。

  • 可以通过多种传输(包括 HTTP GET、HTTP POST 或 SOAP)提供绑定。

  • 绑定提供了有关使用什么协议来传输portType操作的具体信息。

  • 绑定提供服务所在位置的信息。

  • 对于 SOAP 协议,绑定是<soap:binding>,传输是 HTTP 协议之上的 SOAP 消息。

  • 您可以为单个portType指定多个绑定。

绑定元素有两个属性:名称类型属性。

<binding name = "Hello_Binding" type = "tns:Hello_PortType">

name属性定义绑定的名称,type 属性指向绑定的端口,在本例中为“tns:Hello_PortType”端口。

SOAP 绑定

WSDL 1.1 包括 SOAP 1.1 的内置扩展。它允许您指定 SOAP 特定的详细信息,包括 SOAP 标头、SOAP 编码样式和 SOAPAction HTTP 标头。SOAP 扩展元素包括以下内容 -

  • 肥皂:粘合
  • 肥皂:操作
  • 肥皂:身体

肥皂:粘合

该元素指示绑定将通过 SOAP 提供。style属性表示SOAP消息格式的整体风格。rpc的style值指定RPC格式。

传输属性指示 SOAP 消息的传输。值 http://schemas.xmlsoap.org/soap/http 指示 SOAP HTTP 传输,而 http://schemas.xmlsoap.org/soap/smtp 指示 SOAP SMTP 传输。

肥皂:操作

该元素指示特定操作与特定 SOAP 实现的绑定。SoapAction属性指定 SOAPAction HTTP 标头用于标识服务

肥皂:身体

该元素使您能够指定输入和输出消息的详细信息。对于 HelloWorld,body 元素指定 SOAP 编码样式以及与指定服务关联的命名空间 URN。

这是示例章节中的一段代码 -

<binding name = "Hello_Binding" type = "tns:Hello_PortType">
   <soap:binding style = "rpc" transport = "http://schemas.xmlsoap.org/soap/http"/>
   <operation name = "sayHello">
      <soap:operation soapAction = "sayHello"/>
			
      <input>
         <soap:body
            encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
            namespace = "urn:examples:helloservice" use = "encoded"/>
      </input>
			
      <output>
         <soap:body
            encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
            namespace = "urn:examples:helloservice" use = "encoded"/>
      </output>
   </operation>
</binding>

WSDL - <端口> 元素

<port>元素通过指定绑定单个地址来定义单独的端点。

这是指定端口的语法 -

<wsdl:definitions .... >
   <wsdl:service .... > *
      <wsdl:port name = "nmtoken" binding = "qname"> *
         <-- extensibility element (1) -->
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>
  • port 元素有两个属性:nameBinding

  • name属性在封闭的 WSDL 文档中定义所有端口中提供唯一的名称。

  • 绑定属性是指使用WSDL定义的链接规则进行绑定。

  • 绑定扩展性元素用于指定端口的地址信息。

  • 一个端口不得指定多个地址。

  • 端口不得指定地址信息以外的任何绑定信息。

这是示例章节中的一段代码 -

<service name = "Hello_Service">
   <documentation>WSDL File for HelloService</documentation>
   <port binding = "tns:Hello_Binding" name = "Hello_Port">
      <soap:address
         location = "http://www.examples.com/SayHello/">
   </port>
</service>

WSDL - <service> 元素

<service>元素定义 Web 服务支持端口。对于每一种受支持的协议,都有一个端口元素。服务元素是端口的集合。

  • Web 服务客户端可以从服务元素中了解以下内容 -

    • 在哪里访问该服务,
    • 通过哪个端口访问 Web 服务,以及
    • 如何定义通信消息。
  • 服务元素包括文档元素以提供人类可读的文档。

这是示例章节中的一段代码 -

<service name = "Hello_Service">
   <documentation>WSDL File for HelloService</documentation>
   <port binding = "tns:Hello_Binding" name = "Hello_Port">
      <soap:address
         location = "http://www.examples.com/SayHello/">
   </port>
</service>

port元素的绑定属性将服务的地址与 Web 服务中定义的绑定元素相关联。在此示例中,这是Hello_Binding

<binding name =" Hello_Binding" type = "tns:Hello_PortType">
   <soap:binding style = "rpc"
      transport = "http://schemas.xmlsoap.org/soap/http"/>
   <operation name = "sayHello">
      <soap:operation soapAction = "sayHello"/>
		
      <input>
         <soap:body
            encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
            namespace = "urn:examples:helloservice" use = "encoded"/>
      </input>
			
      <output>
         <soap:body
            encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
            namespace = "urn:examples:helloservice" use = "encoded"/>
      </output>
   </operation>
</binding>

WSDL - 总结

我们在本教程中介绍了 WSDL 的基础知识。下一步是学习 SOAP、UDDI 和 Web 服务。

网页服务

Web 服务是开放标准(XML、SOAP、HTTP 等)Web 应用程序,它们与其他 Web 应用程序进行交互以交换数据。

要了解有关 Web 服务的更多信息,请访问Web 服务教程。

UDDI

UDDI 是一种基于 XML 的标准,用于描述、发布和查找 Web 服务。

要了解有关 UDDI 的更多信息,请访问UDDI 教程。

肥皂

SOAP 是一种简单的基于 XML 的协议,允许应用程序通过 HTTP 交换信息。

要了解有关 SOAP 的更多信息,请访问SOAP 教程。

WSDL - 参考资料

如果您有兴趣将您的公司、网站或书籍列为 WSDL 资源,请通过 webmaster@tutorialspoint.com 联系

WSDL 规范列表

规格 草案/提案 W3C 推荐
     
WSDL 1.1 注释

2001 年 3 月 15 日

 
WSDL 使用场景

2002 年 6 月 4 日

 
WSDL 要求

2002 年 10 月 28 日

 
WSDL架构

2004 年 2 月 11 日

 
WSDL 术语表

2004 年 2 月 11 日

 
WSDL 使用场景

2004 年 2 月 11 日

 
WSDL 1.2 核心语言

2003 年 6 月 11 日

 
WSDL 1.2 消息模式

2003 年 6 月 11 日

 
WSDL 1.2 绑定

2003 年 6 月 11 日

 
WSDL 2.0 入门

2006 年 3 月 27 日

 
WSDL 2.0 核心语言

2006 年 3 月 27 日

 
WSDL 2.0 附件

2006 年 3 月 27 日

 
WSDL 2.0 SOAP 1.1 绑定

2006 年 3 月 27 日

 
WSDL 2.0 RDF 映射

2006 年 5 月 18 日

 
WS 寻址核心  

2006 年 5 月 9 日

WS 寻址 SOAP 绑定  

2006 年 5 月 9 日

网页架构  

2004 年 12 月 15 日