极简单问题,初学者求教。

gzl 2003-01-02 11:55:09
在delphi中,file->new->other...中的new选项卡中的web server application与websnap选项卡中的websnap application有什么区别?开发出来的东西有什么不一样?开发的过程有什么区别?等等...
请说得详细点,越详细分越多!感谢。
...全文
8 点赞 收藏 9
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzl 2003-01-07
我手里有本书,说的例子都在websnap中用了delphi的vcl组件的,都是自动生成页面的,请问:用websnap能不能自己针对一个action写代码?websnap选项卡中的组件在两种new item中都可以使用吗?感谢。
回复
gzl 2003-01-07
up.
回复
del_c_sharp 2003-01-05
呵呵,刚才的话严重了.

楼主想问的websnap和 webbroker的关系和区别.
他们都是为了开发web server的快速引擎~~~开发直接的web访问服务
只是websnap更加复杂和强大

黑子兄贴的是主要围绕web service讨论的.web service本身也可以通过http
协议实现,但他们的理念是完全不同的.webservice是提供了一种标准的接口供各种客户使用,当然他可以封装web server像黑子所贴的内容~~
回复
del_c_sharp 2003-01-05
嘻嘻嘻~~~
楼主~~好像太阳黑子回答的东西和你问的东西不是一回事~~怎么有这么多叫好的,受不了~~~

回复
gzl 2003-01-05
还有什么??感谢。
回复
okfly 2003-01-02
用Delphi 5创建Web Services
Lubomir Rosenstein


摘 要:用Delphi 5创建Web Services
关键字:Web services,Delphi 5
类 别:MS.NET



中文开发在线原创作品,未经允许,严禁任何形式的转载



Web Services是微软之梦。许多业界大腕开始对它感兴趣,并以极大的热情做好准备迎接新方向。在最后关头,甚至Borland也决定不置身事外。然后,在长久的沉默之后,突然抛出Delphi 6……

政治与梦想

我尚无缘得见新版本的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;

搞掂啦。恭喜恭喜!我们拥有
回复
gzl 2003-01-02
up.
回复
e5022 2003-01-02
真服上面的这位老大(太阳黑子),佩服。
回复
gzl 2003-01-02
感谢!!!
还有什么没?多谢大家帮忙!一定给分,分不够可以加。
回复
发动态
发帖子
网络通信/分布式开发
创建于2007-08-02

1565

社区成员

Delphi 网络通信/分布式开发
申请成为版主
社区公告
暂无公告