首页 | 社区 | 博客 | 招聘 | 文章 | 新闻 | 下载 | 读书 | 代码
亲,您未登录哦! 登录 | 注册

用Delphi 5创建Web Services

打印文章

分享到:

M 作 者: cn_prince(欢喜王子) 2001-06-11 20:58:55 :0 :0    
[回复] [打包] [转贴]  
我尚无缘得见新版本的Delphi。据可靠消息称,它提供对SOAP--Web Services的基础--的全面支持,而扔弃了Borland MIDAS。

为什么这只软件大鲨会对Web Services如此钟情?他们的动机很容易明白。Web services意味着不用再卖产品,而是卖服务。不再会有盗版。版权受到完全保护:制造商独家保有软件。和消费者签订的合同将会是长期的。而且如同上瘾一半,用户用得越多,就越是想用。对于大企业来说这就是白花花的银子、用户忠诚和集权。从坏处想,Web services也有可能使客户的交流和日常生活被主宰--新资本主义革命的混合体以及"大哥"--噩梦。

有人希望那只是刺激的白日梦。只有在未来才能看到Web services在社会中所起的作用。但无庸置疑,它们已经使业界产生了极大的改变,就像PC和Internet的出现一样。而我们,开发人员,必须做好准备。

这里有一个简单的例子--执行某个数学计算,x+y什么的。(这是一个高度抽象的例子;你可以把它投射到真实世界中)。以前,要完成这个任务,用这样的代码:

function HaveSum (x: integer; y: integer): integer;
begin
  Result:=x+y;
End;

后来,人们发明了OOP(面向对象编程)。于是我们就有了一个包括两个整数值和一个GetSum方法的ThaveSum类,然后用它创建一个对象实例。在设计层面上,这显得既雅致又高效(此出就不再继续讨论OOP的好处了)。跟着是微软的COM。对象不再只是被创建,更是一个生命体。程序设计变成协调所有这些生命体,完成某种任务,而非单纯做一个工匠的工作。

问题在于这些生命体并非都易于伺候,但Microsoft Office仍然实现了这一策略。理论上COM被设计为可以接收远程调用,如果一个办公室里有20个用户想知道x+y到底等于几,我们就只需要创建一个IhaveSum COM,然后分发、销售、回答所有这些用户的问题。

现在,Web services之梦来了:不分发产品,而是分发服务。如果谁要求服务,就要呼叫分发者执行,并且为服务付钱。软件用户与软件产品完全隔绝,他只关心产品给出的结果(而那就是在已然过去了的"黄金时代"里,购买或合法拷贝的真正原因)。


简单的Delphi 5例子

Web services的两大柱石--HTTP和XML已经为Delphi开发者所熟知了。下面我想展示用Delphi 5来实现Web services。希望Delphi 6的例子很快就可以给出。

首先我要实现HTTP协议。服务器可以是ASP或PHP页面。既然我们用Delphi,那就用Delphi CGI stand-alone可执行文件做服务器。只需要几分钟时间、一行代码就可以完成(我在解释给菜鸟听呢)。

选择 File(文件)- New(新建)- New Web Server Application(新Web服务器应用程序)。我们要做的事用CGI就可以了,而且便于调试。在真实环境中用ISAPI DLL会好些。于是我们得到一个WebModule。打开它的Action Editior,在OnAction事件中加入下面的代码:

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Response.Content :=IntToStr( StrToIntDef(Request.QueryFields.Values['x'],0) +
  StrToIntDef(Request.QueryFields.Values['y'],0));
end;

服务器计算两个变量之和,然后传送到客户端。

在Delphi中可以有多种方法实现HTTP协议。可以用WinInet API函数(在Marco Cantu的《精通Delphi 5》中有很好的例子)或者Indy组件(在Delphi 6中应该整合了Indy,也可以在http://www.nevrona.com/Indy下载。这里我打算用Microsoft Internet Transfer Control 6.0,所以你需要在Delphi中Import类型库MSINET.OCX。在INET98.CHM帮助文件里面可以找到更多信息。这个控件用起来很简单,在我们的例子中也只需要一行代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption :=
    inet1.OpenURL('http://localhost/scripts/webcalc.exe?x='+Edit1.Text+'&y='
      +Edit2.Text);
end;

控件向服务器发送请求,并且接收回答。OnStateChange事件允许我们得到操作的详细信息:

procedure TForm1.Inet1StateChanged(Sender: TObject; State: Smallint);
begin
case state of
  icResolvingHost: statusbar1.Panels[0].Text :=
    ('寻找指定服务器的IP地址。');
  icHostResolved: statusbar1.Panels[0].Text :=
    (' 成功找到IP地址。');
  icConnecting: statusbar1.Panels[0].Text :=
    (' 正在连接到主机。');
  icConnected: statusbar1.Panels[0].Text :=
    (' 成功连接到主机。');
  icRequesting: statusbar1.Panels[0].Text :=
    (' 发送请求。');
  icRequestSent: statusbar1.Panels[0].Text :=
    (' 成功发送请求。');
  icReceivingResponse: statusbar1.Panels[0].Text :=
    ('接收主机回应。');
  icResponseReceived: statusbar1.Panels[0].Text :=
    (' 成功接收到主机回应。');
  icDisconnecting: statusbar1.Panels[0].Text :=
    (' 从服务器断开。');
  icDisconnected: statusbar1.Panels[0].Text :=
    ('成功从服务器断开。');
  icError: statusbar1.Panels[0].Text :=
    ('与服务器通讯发生错误。');
  icResponseCompleted: statusbar1.Panels[0].Text :=
    ('The request has completed and all data has been received');
end;
end;


图一:客户端

客户端应用程序做好了。它不自己做计算工作,而是依靠Webcalculator服务器完成任务。我们的Web services可以为任何人提供服务……下一个例子稍微高级些:使用XML传递变量。XML连初学者也应该掌握,它不过是储存和交换数据的一种标准格式而已。这回我用TNMHTTP的Post方法(在Delphi的FastNet控件组):

Web.Post('http://localhost/scripts/webCalc.exe',' '+strX+'+strY+');  

这个命令做了所有工作,不同之处在于它用来传递结构化了的XML文档。服务器需要解析XML。这是我们需要另一种技术:Charlie Calvert在《Delphi中的XML解析》种作了详细说明。我将用MSXML.DLL库来做服务器端XML解析。你需要import这个Microsoft库到Delphi中。同样,在OnAction事件中加入代码:

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean(;
var
  doc : IXMLDOMDocument;
  ElemList: IXMLDOMNodeList;
  x, y:integer;
  begin
    Doc:= CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument;
    Doc.loadXML (Request.ContentFields.Text );
    ElemList:= Doc.getElementsByTagName ('varX'):
    x:= StrtoIntDef(ElemList.item[0].text,0);
    ElemList:= Doc.getElementsByTagName ('varY);
    y:= StrtoIntDef(ElemList.item[0].text,0);
    Response.content:= #10+#13+InttoStr(x+y) ;
  end;

可以用多种方法来读取XML文档。Microsoft XML SDK中有很好的文档。服务器做好了。XML被用来传递变量,而不只是x和y这么简单。


DELPHI 5 与 SOAP 例子  

不用等Delphi 6,我们可以马上开始用SOAP工作。可以下载SOAP Toolkit 2.0,在Delphi 5中创建Web service。在最后一个例子中,我们用它来实现Webcalculator。

第一步,创建一个提供服务的COM对象。然后,构造一个WSDL(Web Service Description Language,Web服务描述语言)文件,用于Web services。幸运的是我们可以用SOAP Toolkit 2.0自动创建这些文件。最后一步,开发一个Delphi应用程序,它将使用服务。这样,我们要通过Delphi控制SOAP客户端。

开始。第一个任务是创建简单的COM对象。它只有一个接口和一个方法:GetSum。

ISummer = interface(Idispatch)
     function GetSum(const x: WideString; const y: WideString): WideString;
       safecall;

function TSummer.GetSum(const x, y: WideString): WideString;
begin
  Result:= InttoStr(SysUtils.StrtoInt(x)+ SysUtils.StrtoInt(y);
end;

{和前一个例子差不多,是吧?像做一个Active Server Object一样。用Delphi写简单ASP的方法。编译为ActiveX Dll,发布到ASP文件:}

Set DelphiASPObj = Server.CreateObject("Project1.Summer")
Response.Write ( DelphiASPObj.GetSum(Request.QueryString.Item("x"),
    Request.QueryString.Item("y")))
Set DelphiASPObj = Nothing
  Response.End  


图二 我们的COM Webcalculator,提供Web service

如果不出意外的话,计算机可以开始工作了。在浏览器中输入http://localhost/scripts/webcalculator.asp?x=3&y=8之类的地址,应该返回答案了。

接下来,安装SOAP Toolkit。下载地址:Microsoft - msdn-files/027/001/580/msdncompositedoc.xml。然后,从Toolkit菜单中选择WSDL生成器(generator)。输入服务名,ActiveX Dll的名称,还有生成WSDL、WSML的web目录。

最后,用三行代码创建客户端:

procedure TForm1.Button1Click(Sender: Tobject);

var
  SoapClient: OleVariant;
  SoapClient := CreateOleObject('MSSOAP.SoapClient');
begin
  SoapClient.mssoapinit('http://localhost/scripts/sumservice.wsdl','SumService','SummerSoapPort');
  showmessage(SoapClient.GetSum(Edit1.Text,Edit2.Text));
end;

搞掂啦。恭喜恭喜!我们拥有了自己的SOAP Webcalculator!

很容易把这个例子移植到真实软件环境:比如,一个web service,用来储存客户地址簿。

用Delphi 5、HTTP和XML就可以创建Web services。Import微软Simple Object Access Protocol(SOAP)Toolkit 2.0,使得这一切成为可能。下一版本的Delphi承诺百分之百支持SOAP,并能用这种新工具实现Web services。我们正在进入Web services时代,有一样是可以确定的:它将使我们--程序员--的生活更加兴奋。  

本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( Pfan.cn )

编程爱好者论坛

本栏最新文章