delphi提供的web services控件说明
T H T T P R I O通过H T T P和S O A P封包调用远程Web Service
TO P To S o a p D o m C o n v e r t把Object Pascal调用的We b
S e r v i c e服务转换为S O A P形式的封包,并且把Web Service
返回的S O A P结果封包转换为Object Pascal的类型以便让客
户端应用程序访问结果
T H T T P R e q R e s p通过Wi n i n e t . d l l传送出H T T P请求的S O A P
封包给远程Web Service,或是接受远程Web Service返回的
H T T P结果
T H T T P S o a p D i s p a t c h e r会拦截H T T P请求,并且把S O A P的
请求分派给T H T T P S o a p P a s c a l I n v o k e r组件以激活对应的
Web Service函数
T H T T P S o a p P a s c a l I n v o k e r负责根据H T T P请求调用正确的
Web Service服务
T W S D L H T M L P u b l i s h负责自动产生描述Web Service的服
务信息以及W S D L内容
T S o a p C o n n e c t i o n可以调用在Web Service之中实现的应用
程序服务器
通过Delphi6的We b S e r v i c e s组件组,程序员可以轻易地实现Web Service
让客户端调用,或是开发客户端应用程序调用任何种类的Web Service
要使用Web Service,那么必须在
Wi n d o w s 平台中使用Wi n i n e t . d l l 来实际传送和接收H T T P请求,因此
Wi n i n e t . d l l必须安装在用户的系统之中。
首先当然需要实
现Web Service,接着要输出描述Web Service的W S D L内容以便让客户端应用
程序知道Web Service提供的服务。
接着客户端应用程序便可以根据W S D L的内容来调用Web Service并且取
得Web Service提供的服务
Web Service应用程序也可以是一般的应用程序,不一定必须是
Web类型的应用程序
注意使用Soap Server Application向导建立的Web Service应用程序都
是属于We b类型的Web Service服务器。不过这并不代表Web Service应
用程序一定必须是We b类型的应用程序,基本上任何类型的应用程序
都可以成为Web Service服务器
T H T T P S o a p D i s p a t c h e r组件主要是用来分配客户端的请求到适
当的服务端方法来处理
当T H T T P S o a p D i s p a t c h e r组件拦截到这种H T T P请求之后,就会
调用T H T T P S o a p P a s c a l I n v o k e r组件的D i s p a t c h S o a p方法来处理这个H T T P请
求。T H T T P S o a p P a s c a l I n v o k e r组件的D i s p a t c h S o a p方法则会根据这个H T T P请
求找到在Web Service服务器中实现的对应方法,然后调用这个方法来处理此
H T T P请求
请注意T W S D L H T M L P u b l i s h组
件的P a t h I n f o特性值为w s d l *,而M e t h o d Ty p e特性值为m t A n y,这代表任何对
于这个范例Web Service 服务器提出w s d l为结尾的H T T P请求都会由
T W S D L H T M L P u b l i s h组件处理。而T W S D L H T M L P u b l i s h组件处理的方式就
是返回此Web Service的W S D L文件内容
设定T W S D L H T M L P u b l i s h组件的
A d m i n E n a b l e d特性值为Tr u e。设定A d m i n E n a b l e d特性值为Tr u e可以让我们稍
后使用浏览器来进行管理工作,
Web Service真正的意义是开放对外提供的服务,并且需要程序员实现
Web Service通过W S D L对外保证的服务功能。
Delphi 在实现Web Service的
服务时是使用接口( I n t e r f a c e )的机制,程序员必须先定义一个或是数个接口,
并且在接口中定义Web Service提供的服务(函数),最后再使用类实现这些接
口提供的服务。
程序员使用
D e l p h i的接口定义Web Service的服务,使用D e l p h i类实现服务接口,接着必
须注册服务接口信息以及实现的类信息。如此一来就可以自动让客户端通过
I n t e r n e t / I n t r a n e t的S O A P调用并且使用Web Service对外提供功能
先定义,然后注册Web Service的服务接口。
接口必须是从D e l p h i定义的I I n v o k a b l e接口继承下来的,
因为要让客户端的应用程序能够从远程调用, Web Service的接口必须包含新
的Delphi 接口RT T I信息(Interface RT T I ),如此一来才能够使用较有效率的
静态绑定调用
请注意Web Service要对外输出的方法(服务)最好是声明使用
s t d c a l l的调用惯例,否则客户端可能无法调用到此输出的方法(服务)。
D e l p h i的I I n v o k a b l e接口是下面这样定义的,它使用了新的Delphi 6的编
译指令{ $ M + }和{ $ M - },这样可以在I I n v o k a b l e接口和所有从I I n v o k a b l e接口
继承下来的接口中包含接口RT T I以便让T H T T P S o a p P a s c a l I n v o k e r组件能够调
用到正确的接口方法。
IUnknown = IInterface;
{ $ M + }
IInvokable =i n t e r f a c e( I I n t e r f a c e )
e n d;
{ $ M - }
在声明了I F i r s t W S接口之后,接着必须注册此接口,之后才能够顺利地
让客户端调用。要注册Web Service接口就必须使用Delphi 6内部的全局对象
变量I n v R e g i s t r y V。要访问I n v R e g i s t r y V,程序员首先在程序代码中使用
I n v o k e R e g i s t r y程序单元,然后调用I n v R e g i s t r y函数。
取得了I n v R e g i s t r y V对象之后,就可以调用它的R e g i s t e r I n t e r f a c e方法注
册I F i r s t W S接口了。R e g i s t e r I n t e r f a c e方法具有如下的函数原型:
p r o c e d u r e RegisterInterface(Info: PTypeInfo; Namespace: string = '';
WSDLEncoding: InvString = ''; Doc: string = ''; ExtName: InvString = '');
R e g i s t e r I n t e r f a c e程序接受四个参数,第一个参数是程序员定义的接口的
48使用Delphi 6 / Kylix 2 SOAP / Web Service程序设计篇
下载
编译器信息, I n v R e g i s t r y V会使用这个接口信息动态地建立调用结构。第二
个参数N a m e s p a c e是一个U R I做为代表接口信息的惟一标识符,以便可以让
客户端使用U R I来找到特定的Web Service接口。如果程序员没有传入这个参
数,D e l p h i会自动地产生它,结果U R I使用如下的形式:
'urn:' + URIApp 定+义 接口的程序单元名称+ '-' + 定义的接口名称
其中U R I A p p是代表Web Service应用程序的U R I,在一般的情形中是空
字符串。因此在这个范例中D e l p h i会自动产生如下的N a m e s p a c e:
urn: FirstWSIn-tfI F i r s t W S
实现Web Service服务接口
有了I F i r s t W S接口之后接下来的工作当然就是要实现这个接口以便客户
端调用。
u n i t F i r s t W S I m p l ;
i n t e r f a c e
u s e s
FirstWSIntf, InvokeRegistry;
t y p e
TFirstWS =c lass (TInterfacedObject, IFirstWS)
p u b l i c
f u n c t i o n GetWSMsg : Strings; t d c a l l;
e n d;
i m p l e m e n t a t i o n
{ TFirstWS }
f u n c t i o n TFirstWS.GetWSMsgS: t r i n g;
b e g i n
Result := 太'棒了, 这是我使用Delphi 建6 立的第一个Web Service!!!';
e n d ;
p r o c e d u r e F i r s t W S F a c t o r y (o u t obj: TObject);
b e g i n
obj := TFirstWS.Create;
e n d;
i n i t i a l i z a t i o n
InvRegistry.RegisterInvokableClass(TFirstWS, FirstWSFactory);
e n d .
于D e l p h i提供了数种不同的方式让程序员实现Web Service
其中T I n t e r f a c e d O b j e c t类是一个线程安全( T h r e a d S a f e )
的类, 如果程序员要实现任何的D e l p h i 接口, 那么最好是使用
T I n t e r f a c e d O b j e c t类做为基类。
接着就可以编译本范例
并且先执行一次以便向系统注册。请注意,由于在前面是以Web App
D e b u g g e r的类型来实现此Web Service,因此事实上本Web Service是一个
C O M对象,因此必须先执行此范例Web Service以便先向系统注册。在执行了
范例Web Service之后,我们就可以使用Delphi 6的Web App Debugger来观察
此范例Web Service的信息。请点击To o l s | Web App Debugger
如果Web Service是由D e l p h i开发的,那么可以使用T H T T P R I O组件的
U R L特性或是W S D L L o c a t i o n加S e r v i c e和P o r t特性。
2) 如果Web Service 不是由D e l p h i开发的, 那么就必须使用
W S D L L o c a t i o n加S e r v i c e和P o r t特性。
D e l p h i的T H T T P R I O组件能够同时调用由D e l p h i撰写的We b
S e r v i c e,或是由其他开发工具开发的Web Service,例如J a v a、C / C + +等,非
常有弹性。T H T T P R I O组件也能够使用动态绑定的方式调用Web Service或是
使用静态绑定
T H T T P R I O组件四个重要的特性以及它们的说明
W S D L L o c a t i o n 指定绑定Web Service的位置
S e r v i c e 指定要使用Web Service中的哪一个服务
P o r t 指定Web Service的Port Name
U R L 指定Web Service的U R L地址,它必须是D e l p h i中T H T T P S o a p D i s p a t c h e r
组件使用的P a t h I n f o名称
由于S O A P和Web Service仍然在开发的阶段,因此T H T T P R I O组
件不一定能够调用所有由其他开发工具实现的Web Service,虽然
T H T T P R I O组件目前可以调用许多由J a v a和A S P、I S A P I、C / C + +等实
现的Web Service 。但是有一些由J a v a和大部分由. N E T实现的We b
S e r v i c e仍然无法调用。B o r l a n d会在后续的D e l p h i版本和Service Pack
中持续改善T H T T P R I O组件,让它尽可能能够调用所有的Web Service。