2002-08-26 16:18
使用WSDL部署Web服务,第1部分:Web服务和WSDL简介
Bilal Siddiqui(wap_monster@yahoo.com)
CEO,WAP
Monster
2001 年 11 月
在“使用 WSDL 部署 Web 服务”系列中,Bilal 将研究创建、部署和发布 Web 服务的所有主要技术方面 — 从
Web 服务描述语言(WSDL),到简单对象访问协议(SOAP)以及通用描述、发现和集成(UDDI)注册中心。第 1 部分集中讲述了 WSDL
创建:您将学习如何手工创建 WSDL 接口,然后将您的成果与 WSDL 编写工具的输出作比较。
可互操作的基于 Web
分布式应用程序的思想并非新近出现。仅举一例,电子数据交换(EDI)市场需求早在 B2B 在线电子商务获得任何有意义的实现之前就存在了 — 并且随着 B2B
电子市场的普及,互操作性已经成为最迫切的 EDI 需求。
以任何在线电子市场为例。存在着许多企业,各自提供特有的“服务( services)”(让我们称之为“Web 服务(Web services)”)。在当今的电子商务中,尚不存在一种机制,使一个业务能自动发现其预期伙伴提供的服务。所谓的 下一代 .com 还是提供这种自动的发现机制。
什么是 WSDL?
这种新的 .com
需要一种解决方案来描述它所提供的服务(Web
服务)。具体而言,这意味着您需要一种格式或某种类型的语法,使您可以通过使用它们来描述下列问题的答案:
您的在线业务提供什么服务?
您如何调用业务服务?
当用户调用您的业务服务时,该业务服务需要他/她提供什么信息?
用户将如何提供这些必需信息?
服务将以什么格式发送返回给用户的信息?
很幸运,WSDL 提供了完成所有这些作业的机制。
WSDL 和 SOAP
为更好理解 WSDL 是如何工作的,我将首先描述
SOAP 和 HTTP 是如何使用 WSDL 工作的。WSDL 的用途是“描述”您的 Web 服务。业务之间将通过交换 WSDL
文件来理解对方的服务。一旦知道您伙伴的服务并希望调用它们,SOAP 就派上用场了。可以将服务看作是通过 SOAP 访问的对象。
最有可能的情况是,您将通过因特网或电子邮件与潜在伙伴通信。当然,因特网使用 HTTP 而电子邮件以 SMTP 方式工作,这使得 HTTP 和 SMTP 成为作为 SOAP 的“传输服务提供者”的有利候选人。
WSDL 编写
现在,我将讲述为 Web 服务编写 WSDL
的过程。目的是公开现有的 Web 服务。您所处的情况也许就是下列情况之一:
您有一个现存的服务(例如,一个网站),并希望表示它的功能性。
您有一个
WSDL,并且希望依照已经决定表示的功能性来实现 Web 服务器端的逻辑。(有些人也许会认为这是一个不可能的方案,但是 UDDI
的指纹概念使它变得极为可能;我将在本系列的第四部分讨论 UDDI)。
您正在从零开始,并且既无网站又无 WSDL 界面。
本文中所涵盖的信息适用于这些可能性中的任意一种或全部。
WSDL 编写的四个步骤
我将把 WSDL
编写分成四个简单步骤。遵循每个步骤,您的 Web 服务将准备就绪用于部署。
步骤
1:服务接口
您将构建一个移动电话销售公司的服务接口作为样本项目(我将这个服务称为
MobilePhoneService)。该公司销售不同型号的移动电话,所以公司 Web 服务的后端数据存储库中将包含一个具有两列(model number 和
price)的表格。(为了将焦点保持在 WSDL 本身,我保持该表格的简单性)。有两个关于要使用 WSDL 表示的服务的方法:
getListOfModels ()
getPrice (modelNumber)
GetListOfModels 方法提供了一个字符串数组,其中每个字符串表示一种移动电话的型号。 GetPrice 获得型号,然后返回它的价格。WSDL 将这些方法作为操作调用。现在将开始构建“WSDL 接口文件(WSDL interface file)”。
每个 WSDL 文件的根元素都是
关于名称空间只要注意一点:WSDL 广泛地使用名称空间这一概念。我鼓励您到 W3C 的官方网站去学习关于名称空间的更多知识(请参阅参考资料)。WSDL 是这种思想的一种实现,因为名称空间提供了无限的灵活性,而这恰恰是用于电子数据交换的可移植格式所需要的。
必须为每个服务提供一个名称。在本例中,仅有一个服务(因此只有一个
在每个服务内可以有几个方法、或者 operation,WSDL 通过
此时,WSDL 文件看上去象清单 1。
清单 1:定义操作
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.mobilephoneservice.com/MobilePhoneService"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
.......
.......
.......
.......
步骤
2:指定参数
定义好操作(或方法)以后,现在需要指定将向它们发送和从它们返回的参数。在 WSDL
术语中,所有参数称为“消息”。认为您是在递送消息而结果得到返回的消息是有用的。方法调用是这样一种操作:它准备返回“消息”来响应进入的消息。
请回忆,在第一步骤中有两个操作要表示。第一个操作 getListOfModels
不必获得任何参数并且返回一个字符串数组,其中每个字符串表示移动电话的型号。因此,必须定义一个包含字符串数组的
看看清单 2 中的各种
我已包括了
要回答为什么,让我们以 getListOfModels 操作返回的字符串数组为例。WSDL 使用 XML 模式定义(XSD)定义的一些原始数据类型(诸如 int、float、long、short、byte、string、Boolean 等等),并允许您直接使用它们,或者以这些原始数据类型构建复杂数据类型后,在消息中使用它们。这就是为什么当引用复杂数据类型时,您需要定义自己的名称空间。在本例中,需要为 array of strings 构建一个复杂数据类型。
现在来看怎么做问题,您将使用 XSD 创建自己的名称空间。为实现这个目的,我在
在清单 2 中,我以类似的方式定义了另外两个消息 PhoneModel 和 PhoneModelPrice。这两个消息只使用了 xsd 名称空间中的原始数据类型 string,因此您不必为使用它们而定义任何更复杂的数据类型。
您也许已经注意到当创建
至今,清单 2 准确地限定了目前的讨论的范围。
步骤
3:消息传递和传输
我以一种抽象方式定义了操作和消息,而不考虑实现的细节。实际上,WSDL 的任务是定义或描述 Web
服务,然后提供一个对外部框架的引用来定义 WSDL 用户将如何实现这些服务。可以将这个框架当作 WSDL
抽象定义和它们的实现之间的“绑定(binding)”。
当前,最流行的绑定(binding)技术是使用简单对象访问协议(SOAP)。WSDL 将指定能够访问 Web 服务实际实现的 SOAP 服务器,并且从那时起 SOAP 的整个任务就是将用户从 WSDL 文件带到它的实现。SOAP 是本系列文章中下一部分的主题,所以我将暂时避免讨论 SOAP 细节而继续集中讲述 WSDL 编写。
WSDL 编写的第三个步骤是描述将 SOAP 与 WSDL 文件绑定到一起的过程。您将把
WSDL binding 元素包含您将用于绑定用途的外部技术的声明。因为正在使用 SOAP,所以这里将使用 SOAP 的名称空间。WSDL 术语中,对外部名称空间的使用称为 extensibility 元素。
在清单 3 中,您将看见一个空的
SOAP 客户机将从 WSDL 文件中读取 SOAP 结构并与另一端的 SOAP 服务器协调,所以必须特别关注 interoperability。我打算在本系列文章的第三部分详细讲述该问题。
在空的
请回忆步骤 2 中,getListOfModels 操作只有输出而无任何输入。因此,必须为该操作提供一个
您已几乎要完成步骤 3 了。只要将下一个操作复制到这个操作的后面,您将完成清单 3。
步骤 4:概括
您已经生成了一个完整描述服务 interface 的 WSDL
文件。现在,WSDL 需要一个附加步骤来创建该 WSDL 文件的概要。WSDL 将该文件称为 implementation
文件,在本系列文章的第四部分中,当您在 UDDI 注册中心发布 Web 服务时,会使用它。请看清单 4 — 这个 WSDL
实现文件。它的主要特性如下:
除了清单 4(实现文件)引用不同的 targetNamespace 去引用实现文件以外,
有一个 元素,该元素引用清单 3 的接口文件(文件名
MobilePhoneService-interface.wsdl)和它的名称空间。
有一个
将 IBM 的 Web Services ToolKit(WSTK)用于 WSDL
编写
现在,Web 服务已经完全就绪用于部署。我已经展示了如何手工创建这些文件(使用象 emacs
这样的简单文本编辑器)。可以使用诸如 IBM 的 WSTK(请参阅参考资料以获得该工具箱以及本文提到的其它参考资料的链接)之类的 Web
服务编写工具来生成相同的这些文件。
WSTK 可以使用向导帮助过程来生成这些文件。用户可以生成与我在以上教程中演示的同样两种方法的 WSDL 文件,并将 WSTK 文件和清单 3 和 4 中的 WSDL 文件作比较。
您将注意到下列差异:
WSTK 依照逻辑规则创建了所有名称属性;在本示例中,我使用了自己视为方便的名称。
WSTK
为每个操作至少生成一个 input 标记,即使该操作不必获得任何输入。listAllPhoneModels 操作没有任何 input 元素,但是如果使用
WSTK 生成相同文件,它将因为包含这个方法的一个空 input 元素。
WSTK 产生了除已生成的两个文件以外的第三个文件。这第三个文件是
SOAP 引擎用于服务部署的 SOAP 部署描述符。我将在本系列文章中讨论服务部署。
在这部分中,我演示了手工进行 WSDL 编写以创建接口和实现文件,并与 IBM 的 Web Services ToolKit 生成的文件作了比较。在本系列的下一部分中,我将讨论在 SOAP 服务器上部署这个 WSDL 服务。