(1)概论 
Web Services是自包含(self-contained)的模块化应用程序,可以被跨越网络(例如World Wide Web)发布(publish)和调用(invoke)。Web Services提供完好的接口定义,说明所提供的服务。

Web Services被设计为允许客户端和服务器进行松散耦合。也就是说,服务器端的实现并不要求客户端应用某种特定的平台或者开发语言。除了在语言无关方式下定义接口之外,Web Services也被设计为允许使用多重通讯机制。

Delphi通过使用SOAP(简单对象访问协议)来实现对Web Services的支持。SOAP是为在分散分布式环境中交换信息而设计的标准轻量型协议。它使用XML来编码远程过程调用,通常使用HTTP作为通讯协议。要获得有关SOAP的更详细的信息,请在 http://www.w3.org/TR/SOAP/ 查看SOAP规范。

注意:虽然Delphi只支持基于SOAP和HTTP的Web Service,但其框架已经十分完整,可以被扩展到其他编码和通讯协议下工作。

Delphi以SOAP为基础的技术可以在Windows下运行,很快也将在Linux上实现,因此它可以作为跨平台分布式程序的基本组分。与发布使用CORBA的分布式程序不同,它在客户端不需要安装任何运行时软件。因为这种技术基于HTTP消息,它的优势在于在各种机器上都得到了广泛的支持。对Web Services的支持建立在Delphi的跨平台Web服务器应用体系结构顶端。

使用Delphi既可以创作实现Web Services的服务器,也可以开发调用这些服务的客户端。如果使用Delphi同时开发服务器和客户端应用程序,开发人员就可以共享定义Web Services接口的单一单元。另外,可以使用Delphi开发实现响应SOAP消息的Web Services的任意服务器程序的客户端,用Delphi开发的发布Web Services的服务器程序也可以被任意的客户端调用。

如果客户端或者服务器不是用Delphi创作的,你仍然可以通过使用WSDL(Web Services定义语言)文档来公布可以使用哪些接口或者引入如何调用这些接口的信息。在服务器端,你的应用程序可以发布一份WSDL文档来描述你的Web Services。在客户端,向导程序将帮助你引入已发布的WSDL文档,为你提供你所需要的接口定义和连接信息。


(2)创作支持Web Services的服务器

在Delphi中,支持Web Services的服务器是通过可调用(Invokable)接口构建的。可调用接口是编译后包含运行时类信息(RTTI)的接口。这份RTTI会在解释传入的客户端方法调用时用到,通过它方法调用才能够被正确的转换(marshal)。

除了可调用接口和实现它们的类之外,你的服务器需要两种:调度者(dispatcher)和调用者(invoker)。调度者(THTTPSoapDispatcher)是接收SOAP消息并将它们传送给调用者的的自动调度组件。调用者(THTTPSoapPascalInvoker)解释SOAP消息,辨别其调用的可调用接口,执行调用并且组装响应消息。

注意:THTTPSoapDispatcher和THTTPSoapPascalInvoker被设计为响应包含SOAP请求的HTTP消息。这种基础体系结构非常通用,不过,它也可以通过使用不同的调度者和调用者组件来支持其它协议。

只要你注册了你的可调用接口和它们的实现类,调度者和调用者就会自动处理所有(在HTTP请求信息的SOAP动作头中调用这些接口的)消息。


(3)构造一个Web Services服务器

通过下列步骤来构造一个实现Web Services的服务器程序。

1、定义构造你的Web Services的接口。这些接口定义必须是可调用接口。最好在单独的单元文件中创建你的接口定义,把它们从包含实现类的单元中分离出来。这样,定义接口的单元就可以同时被服务器和客户端程序所包含。在这个单元的初始化(initialization)区,添加注册这些接口的代码。

2、如果你的接口使用了任何复合(非标准)类型的数据,你就必须保证这些数据类型能够被正确转换(marshal)。Web Services应用程序只能处理包含说明自身结构的运行时类信息(RTTI)的特定对象。有关创建和注册描述复合类型的对象的详细信息,参见”在可调用接口中使用复合类型”一节。

3、定义并完成一系列类来实现你在第1步中定义的可调用接口。每一个实现类中,你可能还需要创建一个工厂过程来示例该类。在该单元的initialization段,增加代码来注册实现类。具体做法参见”创建和注册实现类”一节。

4、如果你的应用程序在试图执行SOAP请求时发生错误,错误会被自动编码封装成一个SOAP故障包,代替方法调用的结果被返回客户端。如果你想传送更多的信息,而不是一条简单的错误消息,可以创建自己的例外类,对错误进行编码并返回。具体做法参?quot;为Web Services创建自定义例外类”一节。

5、选择File/New/Other菜单项,在WebServices页,双击Soap Server application图标。选择实现Web Services的Web服务器应用程序的类型。关于各种类型Web服务器应用程序之间的不同,参见”Web服务器应用程序类型”一节。

 
6、向导生成一个包含三个组件的新Web Service应用程序: 
一个是调用者组件(THTTPSOAPPascalInvoker)。调用者完成SOAP消息和你在第1步中定义的所有接口方法之间的转换。

一个是调度者组件(THTTPSoapDispatcher)。这个调度者会自动响应送入的SOAP消息并把它们传递给调用者。你可以使用它的WebDispatch属性来识别你的应用程序所响应的HTTP请求消息,包括设置PathInfo属性来指明指向你的应用程序的任何URL的路径部分,设置MethodType属性来指明请求消息的方法头。

一个是WSDL发布者(TWSDLHTMLPublisher)。WSDL发布者发布描述你的接口以及如何调用它们的WSDL文档。它使非Delphi编写的客户端程序也可以调用你的Web Service应用程序。

7、选择Project/Add To Project菜单项,把你在第1步到第4步中创建的单元文件加入Web服务器应用程序。