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。
|
请发表评论