WSDL 快速指南



WSDL - 简介

WSDL 代表 Web 服务描述语言 (Web Services Description Language)。它是描述 Web 服务的标准格式。WSDL 由微软和 IBM 联合开发。

WSDL 的特点

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

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

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

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

  • UDDI 使用 WSDL 语言。

  • WSDL 读作“wiz-dull”,拼写为“W-S-D-L”。

WSDL 的使用

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

WSDL 的历史

2001 年 3 月,Ariba、IBM 和微软将 WSDL 1.1 提交给 W3C XML 活动的 XML 协议,作为描述服务的 W3C 说明。

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

WSDL - 元素

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

WSDL 的三个主要元素可以分别定义为:

  • 类型
  • 操作
  • 绑定

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

WSDL 元素

WSDL 文档包含以下元素:

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

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

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

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

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

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

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

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

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

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

  • 导入 - 此元素用于导入其他 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 文档还可以包含其他元素,例如扩展元素和服务元素,使可以在单个 WSDL 文档中组合多个 Web 服务的定义。

继续分析 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 - firstName 参数

    • sayHelloresponse - greeting 返回值

  • 端口类型 - 包含请求和响应服务的 sayHello 操作。

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

  • 服务 - 可在 http://www.examples.com/SayHello/ 访问的服务。

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

WSDL - <definition> 元素

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

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

<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>

从上面的示例中,我们可以得出结论,definitions

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

  • 指定此文档称为HelloService

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

  • 指定默认命名空间: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元素。

<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> 元素

<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> 元素

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

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

  • 绑定提供有关用于传输portType操作的协议的具体信息。

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

  • 对于SOAP协议,绑定为<soap:binding>,传输方式是基于HTTP协议的SOAP消息。

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

绑定元素有两个属性:name属性和type属性。

<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:binding
  • soap:operation
  • soap:body

soap:binding

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

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

soap:operation

此元素指示将特定操作绑定到特定SOAP实现。soapAction属性指定使用SOAPAction HTTP头来标识服务。

soap:body

此元素使您可以指定输入和输出消息的详细信息。在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 - <ports> 元素

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

以下是指定端口的语法:

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

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

  • binding属性使用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服务支持的端口。对于每个支持的协议,都有一个port元素。service元素是端口的集合。

  • Web服务客户端可以从service元素中了解以下信息:

    • 访问服务的位置;
    • 通过哪个端口访问Web服务;以及
    • 如何定义通信消息。
  • service元素包含一个documentation元素,用于提供人类可读的文档。

以下是示例章节中的代码片段:

<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服务

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

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

UDDI

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

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

SOAP

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

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

WSDL - 参考

如果您有兴趣将您的公司、网站或书籍列为WSDL资源,请联系[email protected]

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日

Web架构  

2004年12月15日

广告