在Web服务的世界里,应用程序基本上由远程的、XML驱动的组件构成,这些组件采用不同的语言编写,再采用标准的远程激活协议通过Web连接。服务提供者定义所提供服务需要用到的数据格式。同样的,当你在以上应用模式下接受Web服务时,你也需要采取措施保证你的客户程序采用了服务器期望的数据格式。这正是WSDL(Web服务定义语言)大显身手的地方。
WSDL就是描述XML Web服务的标准XML格式,WSDL由Ariba、Intel、IBM和微软等开发商提出。它用一种和具体语言无关的抽象方式定义了给定Web服务收发的有关操作和消息。就其定义来说,你还不能把WSDL当作一种对象接口定义语言,例如,CORBA或COM等应用程序体系结构就会用到对象接口定义语言。 WSDL保持协议中立,但它确实内建了绑定SOAP的支持,从而同SOAP建立了不可分割的联系。所以,当我在这篇文章中讨论WSDL的时候,我会假定你把SOAP作为了你的通讯协议。
WSDL协议已经被提交给了Internet标准组织W3C审批,目前还处于“确认提交”状态。W3C维持着正规的标准化系统同时提交提案必须经过确定的一套批准过程才能最终成为官方协议。在这种情况下,WSDL的地位,照外行看,至少标准组织在考虑让其成为将来可能标准中的一部分。如果你对这方面的情况感兴趣,或碰巧是一位特关心结果的“失眠症患者”,那么你不妨到W3C网站上去读读有关的建议标准。
作为一种基于XML的标准,如果你对XML具有一定的了解,那么WSDL的结构对你就不会陌生了。WSDL文档由服务用来描述数据类型的一组元素、服务可以收到的“消息”以及关联每条消息的SOAP绑定组成。
清单A就是一份简单的WSDL文档,该文档同W3C网站公布的WSDL示范文本是一样的,它说明了一种股票行情服务(这也是相当标准的一种Web服务)。
再仔细阅读清单A,你可以看到,文档首先以标准的XML头开头,其中包含了一个版本标识,而文档的根元素则被称为definitions。
Definitions元素可以采用若干种可选属性,这些属性说明文档同时定义文档其余部分使用的名称空间(namespace)。在这种情况下,定义被分配了一个名字(StockQuote),某些名称空间定义是根据以下常规前缀缩写制定的:
接下来,为了定义服务的接口需要在type元素内定义所需要的任何复杂类型。这里你必须注意使用标准的XSD句法(属性),它是创造数据类型定义最为适合的方法。不过,如果你愿意,WSDL也能扩展使用不同的类型定义系统。
按WSDL的用法,消息可以是传递给某一服务公布对象上的方法的任何参数或者方法被调用之后的任何返回结果。为了继续使用股票行情这个Web服务例子,单一定义方法多半如以下伪代码所示:
floatgetLastTradePrice(string tickerSymbol)
这样,就像你从清单A所看到的那样,文档中定义了两条消息,一条代表方法的输入参数tickerSymbol(GetLastTradePriceInput消息)另一条代表该方法的返回值(GetLastTradePriceResult消息)——最新的股票价格。
操作把消息组织到一起而且抽象地代表方法定义。在我们的例子中,这两条消息都在 GetLastTradePrice操作元素下的getLastTradePrice对象方法定义中组织起来。在一个 WSDL文件中的所有操作又都挨个在portType元素内分组。
WSDL文档的余下部分采用服务器上的侦听端点(binding 元素)绑定消息同时把端口定义同单一服务实体(service元素)组合起来。清单A的例子就定义了通过SOAP采用服务所需要的绑定。
你可以手工创建WSDL文件,不过,你还可以采用相当多的工具通过WSDL来为你自动处理和定义Web服务。推荐工具软件如下: