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位的UNICODE字符,而ASCII是7位 ,gb2312unicode2字节/字,utf83字节/utf8类似以前的8位转7位的编码,是为 在网络间不同系统的通讯方便而作的转换。 几乎所有用.Net写的WebService只支持DOC方式、Delphi写的只支持RPC方式;J2ME目前对Web Service的支持仅限于RFC172,而 RFC172要求必须为DOC方式(sun怎么偏袒MS?)!
    为了在设计中减少障碍,下面还介绍几个概念。
  1) SOAPSOAP是一种简单有效的数据传输协议,用于分布式网络环境下数据信息交换,它以XML 作为数据传输的格式,搭配Internet上标准的传输协议HTTPSMTPTCP等来传送信息。从本质上看,SOAP事实上只是将RequestResponse经由XML格式把数据打包,达到双方沟通的目的。
    2) WSDL:WSDL(Web Service Description Language)是一种以XML格式描述的Web Service语言,当Web Service Provider 要对外公布提供的 Web Service,就需要通过WSDL来构建描述语言。 WSDL中有两个非常重要的要素: :此WSDL文件所要描述的Web Service集合; 每一个Port代表外界Client可以和此Service沟通的一个进入点,一个Port会指定一个Binding方式。
    3):处理中文乱码的问题: HttpRio Converter Options soUTF8InHeader 设为 True 将生成soap消息的HTTPSoapDispatcher控件,添加encoding调用webservice服务gb2312 HTTPRIO.HTTPWebNode.UseUTF8InHeader := True;
   4)Delphi中,能够传递的自定义类型的对象要继承TRemotable,
  5:修正一个服务器端的一个Bug:ISAPIThreadPoolISAPIApp的次序变一下:ISAPIApp必须在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) 我也曾碰到同样的问题 解决方法是:别设httpriowsdllocation,设它的url localhost//wsdl/IFIRST mydir是你的可执行的虚拟目录,IFIRST是你定义的接口名 ***********************************************************************************************
  DelphiWebService包含的组件解释(7
  (1) THTTPRIO-------:使用Http消息来调用远程使用SOAP的接口对象
  (2) THTTPReqResp---:给服务器发送一个SOAP消息, THTTPReqResp在可调用接口上执行一个方法请求
  (3) TOPToSoapDomConvert ----:TOPToSoapDomConvert处理Soap方法请求的组合与分发
  (4) TSoapConnection:TSoapConnection在客户端的多层数据库应用中创建并维护客户端和作为WebService 的远程应用服务器间的连接
  (5) THTTPSoapDispatcher -----:通过将Soap消息转发给调用者,THTTPSoapDispatcherSoap消息做出响应.
  (6) TWSDLHTMLPublish -----:TWSDLHTMLPublish发布描叙webService应用的Wsdl文档
    (7) THTTPSoapPascalInvoker -----:THTTPSoapPascalInvoker解释Soap的请求信息,并执行相应的可调用接口. ***********************************************************************************************
WSDL 说明:
  (Web Services Description Language) 规范是一个描述接口,语义以及Web服务为了响应请求需要经常处理的工作的XML文档。这将使 简单地服务方便,快速地被描述和记录。以下是一个WSDL的样例:   My first service
它包含了以下的关键信息: 消息的描述和格式定义可以通过XML文档中的和 标记来传送。 标记中表示了消息传送机制。 (e.g. request-only, request-response, response-only)  标记指定了编码的规范  标记中表示服务所处的位置 (URL) WSDLUDDI中总是作为一个接口描述文档。因为UDDI是一个通用的用来注册WSDL规范的地方,UDDI的规范并不限制任何类型或者格式描述文档 。这些文档可能是一个WSDL文档,或者是一个正规的包含导向文档的Web页面,也可能只是一个包含联系信息的地址。现在Java提供了一个 Java API for WSDL (JWSDL)规范。它提供了一套能快速处理WSDL文档的方法,并且不用直接对XML文档进行操作,它会比 JAXP更方便,更快速。 ***********************************************************************************************
SOAP说明
  (Simple Object Access Protocal) 我们先简单了解WebServices运作模式。服务端生成服务描述文件WSDL(Web Services Description Language,类似COMInterface Description Language),如果接收客户端的SOAP请求消息(XML格式数据),解析其调用和参数,根据WSDLWSMLWeb Services Meta LanguageMicrosoft为描述WSDL里提供的方法与实现该方法的COM对象之间的映射关系而特地设立),调用相应COM对象完成指定功能,并返回 SOAP消息遣至用户;客户端取得并解析服务端的服务描述文件从而得知服务端的服务内容及调用方式,生成SOAP请求消息(指定调用的方法 名称和参数)送往服务端。 ***********************************************************************************************
TReomtable说明
  : 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 CommonN
ame: string 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;
TSOAPAttachment说明
  :一种Soap的流类型数据.跟平时的integer等等一个意思 //比如
    (1):服务器端建立一个流输出(result:) GrapStream:=ate; try SoapAttachment:=ate; TBolbField(frmdm.adoqury.fields[0]).SaveToStream(GrapStream); SoapAttachment.SetSourceStream(GraphStream,soReference); result:=SoapAttachment; except if assigned(GrapStream) then GrapStream.free; if assigned(SoapAttchament) then SoapAttchment.free; end
  (2):客户端接受一个流输入 var src:string; begin if not Assigned(SoapAttachment) then exit; Src:=SoapAttachment.CacheFile; ....
 例子,基于SoapwebService的分布式网络程序实例
  //编写服务器端 --ok
  1:File --->New---->Other----->WebService--->Soap WebService Application 后生成3个组件 一个是调用者组件:THTTPSoapPascalInvoker:完成Soap消息和.... 一个是调度者组件:THTTPSoapDispatcher:自动响应送入的soap消息,并且把他们传递给调用者,可以使用他的 WebDispatch属性来识别应用程序响应的http请求.包括设置PathInfo属性来指明指向应用 程序的任何URL的路径部分,设置MethodType属性来指明请求消息的方法头. 一个是WSDL发布者:TWSDLHTMLPublisher:WSDL发布者发布描叙接口以及如何调用他们的wsdl文档,使用非delphi 编写的客户端程序也可以调用WebService应用程序.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。