编程是一门艺术

Creative Commons License
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。
raptor.zh(at)gmail.com

archives 存档

01 Jan - 31 Dec 2011
01 Jan - 31 Dec 2010
01 Jan - 31 Dec 2009
01 Jan - 31 Dec 2008
01 Jan - 31 Dec 2007
01 Jan - 31 Dec 2006
01 Jan - 31 Dec 2005
01 Jan - 31 Dec 2004
01 Jan - 31 Dec 2003
01 Jan - 31 Dec 2002
01 Jan - 31 Dec 2001
01 Jan - 31 Dec 2000
01 Jan - 31 Dec 1999

--

links 链接

--

DELPHI 6 抢先研究-- BizSnap/SOAP/WebService 之一

-- 一个 Hello world! 的例子

SOAP 技术号称 Microsoft 之梦,也是 Borland 给 Delphi 6 定下的最大卖点,在6月14日的 DELPHI 6 上海发布会(见 《 Delphi 6 上海发布会》 )上见识过才知道它的厉害。 SOAP 是我得到 Delphi 6 后最想研究的几项新技术之一, 但 Delphi 6 的帮助太不详细,仅有的那两个 DEMO 又太过复杂, 而且还不是基于 HTTP 的,只好自己研究, 最近这两天,总算有大突破,所以来此与大家分享。另外,李维后来也写了一篇文章介绍用 Delphi 6 做 Web Services , 见《樂趣無窮,可能無限的新技術-Web Service》


鉴于 DELPHI 6 自带的 DEMO 太复杂,我在这里写一个简单的 Hello World , 用 Windows98 + PWS 实现:


服务端:

1.New|WebServices|Soap Server Application ,如下图:

选 ISAPI/NSAPI Dynamic Link Library ,如下图:

如果你想试试 DELPHI6 新增的 Web App Debugger,也可以选它,关于它请见 《DELPHI 6 抢先研究 -- Web 应用开发及调试》);

2.SaveAll , Unit1 命名为: MainWM , Project1 命名为: SoapTest ;

3.在 MainWM 单元中的 Uses 中加入: InvokeRegistry 单元;

4.自定义一个接口,及其对应类的实现,通常另建一个单元来放,但因为在客户端可以通过从 WSDL 导入接口的方法来产生一个接口单元, 所以这里是放在 MainWM 单元里的:

  ISoapHello = Interface ( IInvokable )
['{6DF34980-6FFC-11D5-9E62-0050BABD8FE1}'] // 这个GUID你自己用 Ctrl+Shift+G 产生
Function GetHello( aID : Integer ) : WideString; StdCall;
End;

TSoapHello = Class ( TInvokableClass, ISoapHello )
Protected
Function GetHello( aID : Integer ) : WideString; StdCall;
End;

5.实现 GetHello 函数:

Function TSoapHello.GetHello( aID : Integer ) : WideString;
Begin
If ( aID = 1 ) Then
Result := 'Hello world!'
Else
Result := 'Error ID!';
End;

6.注册接口和类:

Initialization
InvRegistry.RegisterInterface( TypeInfo( ISoapHello ) );
InvRegistry.RegisterInvokableClass( TSoapHello );

7.编译之即可产生: SoapTest.dll ;

完成后的 IDE 如下图:

启动 PWS ,设置虚拟目录 soap 为 soaptest.dll 所在的目录,权限为“执行”。打开浏览器, 输入 URL 为:

http://localhost/soap/soaptest.dll/wsdl

即可看到一个表格,显示了此 SOAP 服务(即所谓的 Web Service ) 所提供的 WSDL 其中应该有我们自定义的接口: ISoapHello ,点其链接将返回一个 XML 文档, ISoapHello 就是用这个 XML 文档描述的。


客户端程序(补充:我这里的做法与李维在 《樂趣無窮,可能無限的新技術-Web Service》一文中的做法不同, 客户端程序完全不需要包含服务端的任何程序,唯一的接口单元也是从服务端的 WSDL 中导出 -- Oct.20-01):

1.New|Application 新建一个一般 VCL 应用程序;

2.SaveAll , Unit1 命名为 ClnMain , Project1 命名为 SoapClient ;

3.New|Web Services|Web Services Importer ,如下图:

在下图中的URL中输入: http://localhost/soap/soaptest.dll/wsdl/ISoapHello,

如果上面用浏览器可以看到正确的 XML 文档的话,这时确定后将产生一个单元,其中有我们在服务端定义的接口; 如果你细心的话将会发现其中那个 ISoapHello 接口的 GUID 与服务端并不相同;

4.SaveAll, Unit1 命名为 SoapIntf ,再在 ClnMain 中 Uses 加入 SoapIntf 单元;

5.在 Form1 上放上 Edit, Label, Button, HTTPRIO (在 WebServices 页中的第一个)四个控件,设置 HTTPRIO1.URL 为:

http://localhost/delphi6/soap/SoapTest.dll/soap

6.双击 Button1 输入下面的程序:

Var
p : ISoapHello;
begin
p := HTTPRIO1 As ISoapHello;
Label1.Caption := p.GetHello( StrToInt( Edit1.Text ) );
end;

完成后的 IDE 如下图:

7.编译运行,在 Edit1 中输入"1"按 Button1 , Label1 将显示"Hello world!",输入其它数字将显示"Error ID!";


SOAP so easy.

Jun.20, Jul.29-01

Trackback link:

Please enable javascript to generate a trackback url

No trackbacks

评论(0)


 
   
 
  表情图标 

 


提示: 除了 <b> 和 <i> 之外,其他的Html标签都将从您的评论中去除.url或mail地址会被自动加上链接.