SOAP的正式提出应该在99年或者2000年吧,那个时候还是internet刚开始发展的时候,我也在忙着找工作,对于这个名词应该一无所知,起初接触一些三层从MIDAS,COM还有Cobra等,直到发现了SOAP,才觉得世上真是有这么一种如此便捷的实现三层部署的平台。
闲话多罗嗦了几句,下面进入正题
如果你还没有开始学习SOAP可以建议参考李维大师写Delphi6/Kylix2 SOAP/Web Service程序设计
如果想了解SOAP标准可以参考 SOAP Specification
以下开始一步一步来介绍如何使用Delphi来创建一个Stand alone的Soap Application。
注:笔者使用Delphi7.0
如果你以前写给或者学过Soap Application,教科书上都会说New->Web Service->Soap Application,选择Web App Debgger executable,如下图
然而这样做都摆脱不了对于Web Server的依赖,Delphi有很强大的Indy为其开发免费的Http控件,一样可以用来发布你的Soap程序
步骤一:建立一个Application
步骤二:在主Form上放一些控件如图
本例子使用DBX来连接数据库,当然你可以使用ADO、BDE等等,先不用写代码
步骤三:建立一个Soap Server Data Module New->Others->WebServices->如图
建立这个Data Module是为了可以建立三层的数据库连接,笔者为了简便期间将其他接口也在Data Module中定义(其实按严格来说其他接口应另开单元去实现,而Data Module只是实现数据库操作)。
建立Data Module如下:命名为MySoapTest,放上一个DataProvider。
生成接口和实现类如下:
IMySoapTest = interface(IAppServerSOAP)
['{A2F35762-FD52-44C2-9548-3B26CA5D3DD3}']
end;
TMySoapTest = class(TSoapDataModule, IMySoapTest, IAppServerSOAP, IAppServer)
dsAPP: TDataSetProvider;
private
public
end;
这样就可以在这个上面封装接口或者进行数据访问服务器端编写了。
将DataProvider的dataset指向主窗口的Query
然后写一个方法Test,需要在接口部分定义,然后在实现类中实现。
IMySoapTest = interface(IAppServerSOAP)
['{A2F35762-FD52-44C2-9548-3B26CA5D3DD3}']
function Test:string;stdcall;
end;
TMySoapTest = class(TSoapDataModule, IMySoapTest, IAppServerSOAP, IAppServer)
dsAPP: TDataSetProvider;
private
public
function Test:string;stdcall;
end;
function TMySoapTest.Test: string;
begin
result:= 'Hello World';
end;
然后你需要建一个SoapWebModule,可惜的是Delphi到7.0还不提供向导来单据建一个Soap WebModule,一个简单的方法是用Delphi的向导来建立一个Soap Application,然后将其中的WebModule copy出来,Add到这个project中,不需要编写任何代码,如下图:
服务器端最后一步,就是如何使用Indy Http Server来发布你的Soap,你需要引用一个Unit,这个文件就是 /Borland/Delphi7/Source/Indy/IdHTTPWebBrokerBridge.pas。
在主Form中申明一个Server
FServer:TIdHTTPWebBrokerBridge;
在窗体创建事件中编写如下代码
FServer:=TIdHTTPWebBrokerBridge.Create(self);
FServer.RegisterWebModuleClass(TwmSOAPIndy); //这个是Soap Web Module类
设置服务器端口FServer.port=1024
然后设置FServer.Active属性来启动或者关闭Server
记得Free Server ,FreeAndNil(FServer);
这样服务器端工作就完成了,接下来编写客户端。
客户端完成两个工作,一个是通过三层数据库客户端来连接服务器,取得数据,二是调用服务器端的Test方法。
你需要用到两个控件HttpRIO和SoapConnection。在Web Services一栏中可以找到。
将URL设置成Http://localhost:1024/soap/IMySoapTest,在客户端User服务器端的Datamodule,(其实正确做法是在服务器端将interface和implementation分开,引用interface即可),放一个Button,代码如下:
showmessage((HttpRIO as IMySoapTest).Test);
这样就完成了三层方法调用。
数据库连接只需要拖几个控件(测试前提是服务器启动着),SoapConnection-ClientDataSet-DataSource。
以上讲这些只是提供一个三层的方法调用和数据库访问平台,使用Delphi可以写出更强大的应用,包括对象的三层传递,我也正在研究中,任何一种技术都要放到实际应用中去验证其先进性,希望大家多交流心得。