delphi web services控件组

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。