Delphi调用WebService的实例(非常经典)_第1页
Delphi调用WebService的实例(非常经典)_第2页
Delphi调用WebService的实例(非常经典)_第3页
Delphi调用WebService的实例(非常经典)_第4页
Delphi调用WebService的实例(非常经典)_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Delphi 调用 webservice 经典实例Dispatch: 派遣, 分派 Invoke: 调用 Invokable: 可调用接口TReomtable: WebService 中自定义类都是继承自该类 TSOAPAttachment: Attachment: 附件 , 一种流类型 , 可以返回流数据 CGI: ( EXE)ISAPI: (DLL) Base64 编码: uses EncdDecd; s := EncodeString(s); / 加 base64 编码 s := DecodeString( str ); /解码 UTF8: UTF8 是 8 位的UNICOD字符,而AS

2、CII是7位,gb2312和unicode是2字节/字,utf8 是3字 节/字utf8类似以前的8位转7位的编码,是为了在网络间不同系统的通讯方 便而作的转换。 几乎所有用.Net写的WebService只支持DO(方式、Delphi写 的只支持RPC方式;J2ME目前对 WebService的支持仅限于 RFC172而RFC172 要求必须为DOC方式(sun怎么偏袒MS>)!为了在设计中减少障碍,下面还介绍几个概念。1) SOAP : SOAP是一种简单有效的数据传输协议,用于分布式网络环境下数据信息交换,它以 XML 作为数据传输的格式,搭配 Internet 上标准的传输协议

3、HTTR SMTP TCP等来传送信息。从本质上看,SOAP事实上只是将 Request和Response经由XML格式把数据打包,达到双方沟通的目的。2) WSDL:WSDL(Web Service Description Language)是一种以 XML格式描述的 WebService 语言,当 WebService Provider 要对外公布提供的 Web Service , 就需要通过WSDI来构建描述语言。在WSD中有两个非常重要的要素:此WSDI文件所要描述的 WebService集合; 每一个Port代表外界Client可以和 此 Service 沟通的一个进入点,一个 Po

4、rt 会指定一个 Binding 方式。3) :处理中文乱码的问题 : 将 HttpRio 的 Converter 的 Options 的soUTF8InHeader 设为 True 将生成 soap 消息的 HTTPSoapDispatcher 控件,添 加 encoding 为 gb2312 HTTPRIO.HTTPWebNode.UseUTF8InHeader := True;4) 在 Delphi 中,能够传递的自定义类型的对象要继承 TRemotable,5:修正一个服务器端的一个 Bug:将ISAPIThreadPool和ISAPIApp的次序变 一下 :ISAPIApp 必须在

5、ISAPIThreadPool 之前: uses . ISAPIApp, ISAPIThreadPool 解决如下错误 : Received content of invalid Content-Type setting:text/html -SOAP"expects"text/xml" 6:"XML document must have a top level element. Line: 0" 错误,我该如何解决? 哈纳斯 (2002-08-05 17:26:00) 我也曾碰到同样的问题 解决方法是:别设 httprio 的 wsdlloc

6、ation, 设它的 url 如 http:/localhost/mydir/project1.exe/wsdl/IFIRST mydir是你的可执行的虚拟目录,IFIRST是你定义的接口名*Delphi中WebService包含的组件解释(有7个)(1) THTTPRIO:使用Http消息来调用远程使用SOAP勺接口对象(2) THTTPReqResp-: 给服务器发送一个 SOAF消息,THTTPReqResp在可调 用接口上执行一个方法请求(3) TOPToSoapDomConvert -:TOPToSoapDomConvert 处理 Soap方法请求 的组合与分发TSoapCo nn

7、ectio n:TSoapCo nn ectio n在客户端的多层数据库应用中创建并维护客户端和作为WebService的远程应用服务器间的连接(5) THTTPSoapDispatcher -:通过将 Soap消息转发给调用者,THTTPSoapDispatcher 对 Soap消息做出响应.(6) TWSDLHTMLPublish -:TWSDLHTMLPublish 发布描叙 webService 应用 的Wsdl文档(7) THTTPSoapPascalInvoker :THTTPSoapPascalInvoker解释 Soap的请求信息,并执行相应的可调用接口 *WSDL说明:(We

8、b Services Description Language)规范是一个描述接口,语义以及 Web 服务为了响应请求需要经常处理的工作的XML文档。这将使 简单地服务方便,X X快速地被描述和记录。以下是一个WSD的样例:Myfirst service它包含了以下的关键信息: 消息的描述和格式定义可以通过 XML文档中的和 标记来传送。 标记中表示了消息传送机制。(e.g. request-only, request-response, response-only)。 标记指定了编码的规范 。标记中表示服务所处的位置(URL)。WSDL在 UDDI中总是作为一个接口描述文档。因为 UDDI是

9、一个通用的用来注册 WSD规范的地方,UDDI的规范并不限制任何类型或 者格式描述文档。这些文档可能是一个WSD文档,或者是一个正规的包含导向 文档的Web页面,也可能只是一个包含联系信息的电子邮件地址。现在Java提供了一个Java API for WSDL (JWSDL)规范。它提供了一套能快速处理 WSDI文 档的方法,并且不用直接对 XML文档进行操作,它会比JAXP更方便,更快速。*SOAP说明(Simple Object Access Protocal) 。 我们先简单了解 WebServices 运作模 式。服务端生成服务描述文件 WSDL(Web Services Descri

10、ption Language ,类 似 COM勺 In terface Description Lan guage),如果接收客户端的 SOAP# 求消息(XML格式数据),解析其调用和参数,根据 WSD和 WSMLWebServices Meta Language, Microsoft为描述WSD里提供的方法与实现该方法的 COM寸象之间 的映射关系而特地设立),调用相应 COM寸象完成指定功 能,并返回到SOAP 消息遣至用户;客户端取得并解析服务端的服务描述文件从而得知服务端的服务 内容及调用方式,生成SOA请求消息(指定调用的方法 名称和参数)送往服务 端。*TReomtable 说明

11、: WebService 中自定义类都是继承自该类 / 自己定义一个继承自TRemotable的类(注意只有属性定义,没有方法)TSpeciesInfo = class(TRemotable) private FLength: Integer; FSpeciesName: string; FCategory: string; FCommonName: string; FmoreInfo: string; published property Category: string read FCategory write FCategory; property CommonName: string

12、read FCommonName write FCommonName; property SpeciesName: string read FSpeciesName write FSpeciesName; property Length: Integer read FLength write FLength; property MoreInfo: string read FmoreInfo write FMoreInfo; end;TSOAPAttachme nt说明:一种Soap的流类型数据.跟平时的integer等等一个意思/比如(1) :服务器端建立一个流输出 (result:)Grap

13、Stream:=TMemoryStream.create; try SoapAttachment:=TSoapAttachment.create; TBolbField(frmdm.adoqury.fields0).SaveToStream(GrapStream); SoapAttachment.SetSourceStream(GraphStream,soReference); result:=SoapAttachment; except if assigned(GrapStream) then GrapStream.free; if assigned(SoapAttchament) then

14、 SoapAttchment.free; end(2) : 客户端接受一个流输入 var src:string; begin if not Assigned(SoapAttachment) then exit; Src:=SoapAttachment.CacheFile;例子,基于Soap和webService的分布式网络程序实例/ 编写服务器端 -ok1:File ->New >Other>WebService->Soap WebServiceApplication 后生成 3 个组件 一个是调用者组件 :THTTPSoapPascalInvoker: 完 成Soap

15、消息和.一个是调度者组件:THTTPSoapDispatcher:自动响应送入的soap 消息 , 并且把他们传递给调用者 , 可以使用他的 WebDispatch 属性来识别应 用程序响应的 http 请求. 包括设置 PathInfo 属性来指明指向应用 程序的任何 URL的路径部分,设置MethodType属性来指明请求消息的方法头.一个是WSDL 发布者:TWSDLHTMLPublisher:WSD发布者发布描叙接口以及如何调用他们的 wsdl 文档, 使用非 delphi 编写的客户端程序也可以调用 WebService 应用程序 .2: 在接口中添加方法和在实现该接口的类中实现该方

16、法 . (1): 接口中自定义 的类都是继承自 TRemotable 类, 该类只能有属性 , 没有方法 (2):3: 将生成的 Dll 文件拷贝到 C:InetPubScripts 目录下面 ./ 编写客户端 -ok(1) :File->New->other >WebSerice->Wsdl Importer:对话框1:WsDl Source:输入=>http: 服务器名/scripts/ 应用程序名/wsdl/相应接 口 , 然后 Next 下步. 然后点 finish(2) : 添加一个普通的窗体,上面放 WebService中的控件:HTTPRIO,编写它

17、的 OnAfterExecute ,OnBeforeExecute 事件 连接服务:http:/server/script/MyWebService.dll/Soap/lmyWeb* 请注意是 Soap/接口 FAttachService 为 WebService 的接口 if FAttachService = nil then begin FAttachService := GetiMyWeb(False, EditUrl.Text); (FAttachService as IRIOAccess).RIO.OnBeforeExecute := HTTPRIO1BeforeExecute;(F

18、AttachService as IRIOAccess).RIO.OnAfterExecute := HTTPRIO1AfterExecute; end; Result := FAttachService;* (HTTPRIO1 as ITest).TestFunction(aParam, bParam);(3) : 注意在 IIS 中设置 Script 的是否有执行权限 .编写一个基于 Soap DataModule 的三层数据库应用服务器端 :建立一个 Web App Debugger executable 类型 , 不需要接口 , 添加一个 Soap Data Module, 放上 Ad

19、oCon,AdoDataSet,DataSetProvider1 设置数据好连接 , 利 用AdoDataSet打开一个数据集,然后编译运行,打开WebApp Debugger查看是否 正确.客户端:(1) 建立一个普通的应用程序 , 添加 SoapConnection1 组件 , 设置他的 url: 格 式为 :http:/localhost:1024/Demo3.wadSoapDemo3/soap(2) 添加一个 ClientDataSet 设置它的 RemoteServer=SoapConnection1,provideName=DataSetProvider1 ( 注意将 Web Ap

20、p Debugger打开)(3)Active就可以看到数据了 .WebService 的服务器端的调试(1) : 编写服务器时选择 :Web App Debugger executable 类型(2) : 编写完成后运行一次服务器 , 则系统将把该 webservice 的类注册(3) : 启动 Tool->Web App Debugger, 设置 servers 的 optionsport=1024 default url=http:/localhost:1024/Demo3.wadSoapDemo3/wsdl其中 demo3为 exe程序的名字,wadSoapDemo为建立服务器的时

21、候填写的类名称,可在主Form的 initialization 中找到:TWebAppSockObjectFactory.Create('wadSoapDemo3')(4) 打开 ie, 在地址输入:http:/localhost:1024/Demo3.wadSo apDemo3/wsdl就可以查看接口了Server 端:Soap DataModule 中加入 ADOCo nn ectio n1、ADODataSetl DataSetProviderl ; DataSetProviderl 的 DataSet 设置为 ADODataSetl; ADODataSetl的 Comm

22、andTex设置为空,Connection 设置为 ADOConnection1。DataSetProvider1 的 DataRequest 事件:function TDataMod.DataSetProvider1DataRequest(Sender: TObject;Input: OleVariant): OleVariant;beginif ADOConnection1.Connected thenbeginADODataSet1.CommandText := Input;Result := DataSetProvider1.Data;end;end;procedure TDataMo

23、d.SoapDataModuleCreate(Sender: TObject); varDataPath: string;constSQL :string = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:programsDelphi7DemosWebServicesSOAPDataModuleDataTree.mdb;Persi st Security Info=False'beginDataPath := ExtractFilePath(Application.ExeName)+ '.Data'XMLTransformProvider1.XMLDataFile := DataPath + 'XML_Document.xml&#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论