用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)_第1页
用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)_第2页
用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)_第3页
用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)_第4页
用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)SOAP(Simple Object Access Protocol,简单对象访问协议) 是一种基于XML的,用于计算机之间交换信息的协议。SOAP能应用于各种消息接发系统,并能通过各种传输协议进行消息传递,但最初的侧重点是通过HTTP传输的远程过程调用。SOAP是Web service的一个重要组成部份,如果把Web service比喻成Internet,那么SOAP就可以比喻成TCP/IP。SOAP是一种协议而非具体产品,微软也有自己的SOAP实现产品,而Java下比较流行的SOAP实现产品就是Apache SOAP,不

2、过它的下一个版本已经改名成AXIS了。 SOAP是用XML文件来做为数据转输的载体的,走HTTP的线路。一般企业的防火墙都开放HTTP的80端口,所以SOAP不会被防火墙阻断,这算是SOAP的一个优点。信息转输的双方都要求支持SOAP服务,因为XML文件发过去,则对方需要有SOAP服务来接收,然后对方会有反馈也是XML文件,这时你也需要安装SOAP服务来接收。 1. 环境配置置 为了运行程序,我我们首先必须须配置好环境境: 共要下载四个软软件包,它们们都是开源免免费的。其中中,前两个是是Apachhe的,后两两个是SUNN网站的,如如下所示: SOAPP:httpp:/appache.free

3、llamp.ccom/wss/soapp/verssion-22.3.1/ Xercces:htttp:/dist/xercees-j/ JavaaMail:http:/produucts/jjavamaail/doownloaads/inndex.hhtml JAF:http:/produucts/jjavabeeans/gglasgoow/jaff.htmll 下载后将它们分分别解压缩。分别在这四个包的解压目录中找到:xerces.jar、soap.jar、mail.jar、activation.jar(JAF的),则是四个jar文件是我们所需要的。 本机安装环境:WindoowsXP(S

4、P2) + JDKK1.4.22_06 + Tomccat5.00.28 + SOAPP2.3.11 配置步骤: 1、安装JDKK和Tomccat。过程程比较简单,这这里不再详述述。 2、将刚才所找找到的四个jjar文件复复制到Tommcat的“Tomcaat 5.00commmonliib”目录下,这这个目录是TTomcatt的默认包目目录,在这个个目录中的所所有包在Toomcat启启动时都会被被自动加载。 3、将 JDDK1.4.2libb路径下的的toolss.jar也也复制到Toomcat的的“Tomcaat 5.00commmonliib”目录下。 4、将soapp解压目录的的web

5、appps目录下下的soapp.war文文件,复制到到Tomcaat的“Tomcaat 5.00webaapps”目录下,这这个目录是TTomcatt的WEB应应用所在目录录。重新启动动Tomcaat,Tommcat会自自动将其解压压,并配置好好路径。可以以尝试在浏览览器中输入“http:/loccalhosst:80880/soaap/”, 看SOOAP是否安安装好。 5、注意在编写写程序时,需需要将所得到到的四个jaar文件路径径设置到所使使用的Javva编程环境境中,因为在在程序中需要要用到其中的的类文件。具具体步骤略。 6、重启Tommcat服务务。这时Toomcat会会将“Tomca

6、at 5.00commmonliib”目录下新加加入的包加载载到内存中。 到此,我们已经经配置好了程程序运行所需需要的环境。 2. 基于SOOAP的XMML文档网络络传输 SOAP规范主主要定义了四四个元素:SSOAP信封封规范,传输输和协议绑定定,编码规则则和一个RPPC协定。用用于实现消息息的网络传输输。 SOAPP信封规范,SSOAP信封封规范对计算算机间传递的的数据如何封封装定义了具具体的规则。这这包括应用特特定的数据,如如要调用的方方法名,方法法参数和返回回值;还包括括谁将处理封封装内容,失失败时如何编编码错误消息息等信息。 数据编码码规则,为了了交换数据,计计算机必须在在编码特定数

7、数据类型的规规则上达成一一致,SOAAP也有自己己的一套编码码数据类型的的约定。大部部分约定都基基于W3C XML SSchemaa规范。 RPC协协定,SOAAP能用于单单向和双向等等各种消息接接发系统。SSOAP为双双向消息接发发定义了一个个简单的协定定来进行远程程过程调用和和响应,这使使得客户端应应用可以指定定远程方法名名,获取任意意多个参数并并接受来自服服务器的响应应。 传输和协协议绑定,提提供了更底层层协议传输SSOAP封套套的一套通用用机制。 而以上四个部分分统称为一个个SOAP消消息。我们先先来看一篇XXML文档是是如何变成SSOAP的。采采用一个简单单的购物订单单文件PO.xm

8、l 。内内容为: Joe Smithh 144 Oak Park Bedfford MA 017300 CCandy Caness 444 1.68 I wannt canndy! 其对应的SOAAP消息为: POST /SServleetTempp/HTTPPReceiive HTTTP/1.0 Host: llocalhhost Contentt-Typee: texxt/xmll; chaarset=utf-88 Contentt-Lenggth: 9939 SOAPActtion: urn:oreillly-jaaws-saampless MeYou99999 Joe Smithh 1

9、44 Oak Park Bedfford MA 017300 CCandy Caness 444 1.68 I wannt canndy! 一个SOAP消消息包括:SSOAP封套套,SOAPP头(可选),SOAPP主体。 我们首先将XMML文档包装装到一个SOOAP体中,然然后再把SOOAP体包装装到一个SOOAP封套中中,可以在封封套中再添加加一个SOAAP头(不是是必须),最最后将SOAAP封套绑定定到一个协议议中。我们来来仔细分析一一下代码。 SOAP封封套 SOAP封套的的声明在XMML标签的最最外层,它表表明了一个SSOAP文档档的边界。下下面的封套标标签显示了三三个必要的属属性,这

10、些属属性指明了封封套中使用的的名字空间和和语法。 其中第一个属性性:xmlnns:SOAAP-ENVV=htttp:/ssoap/eenveloope/ 是一个名字字空间声明,防防止多个XMML文件组合合时发生标签签名字的冲突突。第二个属属性声明了XXML模式实实例的名字空空间。前缀xxsi必须放放在这个名字字空间定义的的所有元素和和属性之前。最最后一个属性性是另外一个个名字空间声声明,它定义义了XML Schemma名字空间间,这个名字字空间下的元元素用来指定定xsi:ttype 属属性的值(如如xsd:sstringg)。 SOAP头头 SOAAP头和体在在语法上非常常类似。SOOAP1.

11、11和SOAPP1.2都没没有头里应该该有些什么,它它就是简单的的存放一些指指令,提供给给接收消息的的SOAP处处理器。建立立在SOAPP之上的更高高级协议(比比如ebXMML消息服务务)就通过定定义一些特殊殊元素来规范范SOAP头头的格式。另另外当对RPPC使用SOOAP时,头头部也可以用用来表示一些些底层信息。 MeYou99999 SOAP主主体 SOAP主体用用来存放实际际数据或消息息的有效负载载(本例中为为XML文档档),从而提提供给最终的的接受者使用用或处理。 SOAP协协议绑定 当绑定到一个HHTTP协议议时,需要在在SOAP封封套前面添加加HTTP头头的信息。 POST /SS

12、ervleetTempp/HTTPPReceiive HTTTP/1.0 Host: llocalhhost Contentt-Typee: texxt/xmll; chaarset=utf-88 Contentt-Lenggth: 9939 SOAPActtion: urn:oreillly-jaaws-saampless 在SOAP1.1中SOAAPActiion是HTTTP绑定所所必须的部分分,它的目的的是让那些路路由或分派的的信息知道该该做些什么,即即使它们根本本不知道SOOAP或者没没有解析SOOAP封套的的方法。而在在SOAP11.2中SOOAPActtion已变变成可选的了了。

13、SOAP消消息的发送与与接收 我们已经看到了了一个SOAAP消息的各各个组成块,接接下来我们要要了解消息是是怎样被创建建的,以及怎怎样在两个端端点之间进行行传输的。 SOAP的发送送端的代码: packagee javaaSoap001; import java.io.*; import java.util.*; public classs GeneericHTTTPSoaapClieent Priivate stattic ffinal StriingDEFFAULT_HOST_URL = htttp:/locallhost:8080/ServlletTemmp/HTTTPReceeive;

14、 priivate statiic finnal Sttring DEFAUULT_DAATA_FIILENAMME = ./PPO.xmll; priivate statiic finnal Sttring URI = urrn:oreeilly-jaws-samplles; priivate Strinng m_hhostURRL; priivate Strinng m_ddataFiileNamme; pubblic GGeneriicHTTPPSoapCClientt(Striing hoostURLL, Strring ddataFiileNamme) thhrows Exceppt

15、ion m_hoostURLL = hoostURLL; m_dattaFileeName = dataFFileNaame; Systeem.outt.prinntln(); Syystem.out.pprintlln(_); Syystem.out.pprintlln(Sttartinng GennericHHTTPSooapCliient:); Systeem.outt.prinntln( hhost uurl = + m_hoostURLL); Systeem.outt.prinntln( ddata ffile = + m_daataFilleNamee); Syystem.out.

16、pprintlln(_); Syystem.out.pprintlln(); /实际的传传送工作是由由sendSSOAPMeessagee()方法完完成的 pubblic vvoid ssendSOOAPMesssage() try / 首先读读取XML文文档,将其解解析成DOMM树。 FileRReaderr fr = new FileRReaderr (m_ddataFiileNamme); /通过调用AApachee getXXMlDoccBuildder()方方法得到一个个解析器,它它返回一个DDocumeentBuiilder对对象。 javaxx.xml.parseers.Dooc

17、umenntBuillder xxdb = oorg.appache.soap.util.xml.XXMLParrserUttils.ggetXMLLDocBuuilderr(); /通过解析器器解析文档,得得到一个Doocumennt对象。 org.ww3c.doom.Doccumentt doc = xxdb.paarse (new oorg.xmml.saxx.InpuutSourrce (ffr); if (ddoc = nulll) tthrow new oorg.appache.soap.SOAPEExcepttion (oorg.appache.soap.Consttants.F

18、AULTT_CODEE_CLIEENT, parsiing errror); / crreate a vecctor ffor coollectting tthe heeader elemeents Vectoor heaaderEllementts = nnew Veector(); / Crreate a heaader eelemennt in a nammespacce org.ww3c.doom.Eleement headeerElemment = ddoc.crreateEElemenntNS(UURI,jjaws:MMessaggeHeadder); headeerElemmen

19、t.ssetAtttributteNS(UURI,SSOAP-EENV:muustUndderstaand,1); / Crreate subnoodes wwithinn the MessaageHeaader org.ww3c.doom.Eleement ele = doc.creatteElemment(From); org.ww3c.doom.Texxt texxtNodee = dooc.creeateTeextNodde(Mee); org.ww3c.doom.Nodde temmpNodee = elle.apppendChhild(ttextNoode); tempNNode

20、= headderEleement.appenndChilld(elee); ele = doc.creatteElemment(To); textNNode = doc.creatteTexttNode(You); tempNNode = ele.appenndChilld(texxtNodee); tempNNode = headderEleement.appenndChilld(elee); ele = doc.creatteElemment(MessaageId); textNNode = doc.creatteTexttNode(99999); tempNNode = ele.app

21、enndChilld(texxtNodee); tempNNode = headderEleement.appenndChilld(elee); headeerElemments.add(hheaderrElemeent); / crreate a vecctor ffor coollectting tthe boody ellementts Vectoor boddyElemments = neww Vecttor(); /获取顶顶层DOM元元素,放到向向量中。顶层层节点的下层层节点元素的的创建和添加加工作由DOOM解析器负负责。 bodyEElemennts.addd(docc.getDD

22、ocumeentEleement (); /Creeate tthe SOOAP ennveloppe org.aapachee.soapp.Enveelope envellope = new org.aapachee.soapp.Enveelope(); /Addd the SOAP headeer eleement to thhe envvelopee org.aapachee.soapp.Headder heeader = neww org.apachhe.soaap.Heaader(); headeer.settHeadeerEntrries(hheaderrElemeents); e

23、nvellope.ssetHeaader(hheaderr); /Creeate tthe SOOAP boody ellementt org.aapachee.soapp.Bodyy bodyy = neew orgg.apacche.sooap.Boody(); body.setBoodyEnttries(bodyEElemennts); /Addd the SOAP body elemeent too the envellope envellope.ssetBoddy(boddy); / Buuild tthe Meessagee. org.aapachee.soapp.messsagi

24、ngg.Messsage mmsg = nnew orrg.apaache.ssoap.mmessagging.MMessagge(); msg.ssend (new jjava.nnet.URRL(m_hhostURRL), UURI, eenveloope); Systeem.outt.prinntln(Sent SOAP Messaage wiith Appache HTTP SOAP Cliennt.); / 从传传输中接受响响应并将其打打印到屏幕上上 Systeem.outt.prinntln(Waitiing foor ressponsee.); org.aapachee.soap

25、p.trannsportt.SOAPPTranssport st = msg.ggetSOAAPTrannsportt (); BuffeeredReeader br = st.reeceivee (); Strinng linne = bbr.reaadLinee(); if(liine = nulll) SSystemm.out.printtln(HHTTP PPOST wwas suuccesssful. n); else whhile (line != nuull) System.out.pprintlln (liine); liine = br.reeadLinne(); catcc

26、h(Excceptioon e) e.priintStaackTraace(); pubblic sstaticc voidd mainn(Striing arrgs) /省略略 在上述程序中,当当我们构造好好SOAP封封套后,它需需要被送到一一个目的地去去。在ApaacheSOOAP中,有有一个Messsage对对象来处理异异步的单向传传送。Messsage.send()方法有三三个参数:一一个URL,用用于指明传送送地点;一个个URI,用用于表示SOOAPActtion头的的值;还有一一个SOAPP封套。SOOAPActtionURRI实际上是是绑定HTTTP的一部分分,用来指定定当一个消

27、息息到达传送目目的地的时候候调用哪个函函数或服务。 Messagee接口用于异异步单向通信信,Messsage.sseng()函数的返回回值为voiid型。但这这并不妨碍它它在双向同步步会话中使用用。当这个MMessagge接口是基基于一个双向向传输协议(例如HTTTP)实现的的时候,SOOAPTraansporrt.recceive()方法就能能用来接收一一个响应。在在SOAPTTranspport是基基于HTTPP实现的情况况下,recceive()方法阻塞塞并等待一个个错误(例如如一个HTTTP请求超时时),或者一一个正确的返返回代码(例例如“HTTP 1.0 2200 OKK”)。 S

28、OAP接收端端代码: public classs HTTPPReceiive exxtendss HttppServllet . /SSOAP请求求以HTTPP POSTT形式接收 public void doPosst(HtttpServvletReequestt requuest, HttpSServleetRespponse respoonse) throows IOOExcepption, ServvletExxceptiion Systeem.outt.prinntln(Receiived rrequesst.); Systtem.ouut.priintln(-); / Trrave

29、rsse thee HTTPP headders aand shhow thhem onn the screeen for(EEnumerrationn enumm = reequestt.getHHeaderrNamess(); enuum.hassMoreEElemennts(); ) SStringg headder = (Striing)ennum.neextEleement(); Striing vaalue = reqquest.getHeeader(headeer); Systtem.ouut.priintln( + heaader + = + vvalue); Systtem.

30、ouut.priintln(-); if(rrequesst.gettConteentLenngth() 0) try java.io.BuuffereedReadder reeader = reqquest.getReeader(); / 获取DDocumeentBuiilder jjavax.xml.pparserrs.DoccumenttBuildder xddb = orrg.apaache.ssoap.uutil.xxml.XMMLParsserUtiils.geetXMLDDocBuiilder(); / 接下来来我们将文件件解析为一个个DOM树,得得到一个Doocumennt对象

31、。 oorg.w33c.domm.Docuument doc = xddb.parrse (nnew orrg.xmll.sax.InputtSourcce (reeader); iif (dooc = null) / Erroor occcured Syystem.out.pprintlln(Dooc is null!); thhrow nnew orrg.apaache.ssoap.SSOAPExxceptiion (orrg.apaache.ssoap.CConstaants.FFAULT_CODE_CLIENNT, pparsinng errror); eelse /在接收端我我们已经

32、有了了一个发送过过来的SOAAP封套。SSOAP封套套是SOAPP文档的最外外层元素,也也是根元素。我我们可以遍历历这个DOMM树从而直接接得到封套以以及它的子节节点。通过调调用unmaarshalll()方法法从文件中得得到一个Ennveloppe实例。 orrg.apaache.ssoap.EEnveloope ennv = orgg.apacche.sooap.Ennveloppe.unmmarshaall(dooc.gettDocummentEllementt(); / 现在我们们得到了一个个封套,我们们按照和前面面相反的过程程来操作它:从Enveelope中中取得BoddyEntrr

33、ys的向量量Vectoor,然后从从向量中取得得Body。 orrg.apaache.ssoap.BBody bbody = env.getBoody(); jaava.uttil.Veector bodyEEntriees = bbody.ggetBoddyEntrries(); jaava.ioo.StriingWriiter wwriterr = neew javva.io.StrinngWritter(); foor (jaava.uttil.Ennumeraation e = bbodyEnntriess.elemments(); e.hasMooreEleementss();) o

34、rgg.w3c.dom.EElemennt el = (orrg.w3cc.dom.Elemeent)e.nextEElemennt(); /在当前前情况下,向向量中只有一一个条目:元元素。从而我我们也就得到到了一个DOOM对象。这这个DOM对对象和前面我我们为建立PPO.xmll而建立的DDOM对象完完全一样。我我们调用静态态方法DOMM2Writter.seerialiizeAsXXML()将将PurchhaseOrrder元素素及其子元素素全部序列化化为一个SttringWWriterr对象。 org.apachhe.soaap.utiil.xmll.DOM22Writeer.serri

35、alizzeAsXMML(orrg.w3cc.dom.Node)el, wwriterr); Syystem.out.pprintlln(wriiter.ttoStriing(); catcch(Excceptioon e) Systeem.outt.prinntln(ee); Systtem.ouut.priintln(_); respponse.setCoontenttType(textt/xml); / Needd thiss to pprevennt Apaache SSOAP ffrom ggackinng 带附件的SSOAP消息息 XML和SOAAP能够很好好的描述数据据,但是许多

36、多应用程序的的数据并不适适合XML来来描述,比如如图像的二进进制数据。SSWA(SOOAP Wiith Atttachmments)可可以解决这个个问题。SWWA把SOAAP协议和MMIME格式式组合到一起起,从而使SSOAP消息息可以包含任任意的数据。这这个模型和在在emaill中包含附件件的方法是一一样的。 MIME协议允允许在消息中中包含任意多多个数据块。每每个数据块都都被一个MIIME头分开开。在SWAA中,整个消消息包含多个个MIME部部分,第一部部分(部分00)是SOAAP封套,剩剩下的部分(1- n)都是附件。所所有这些部分分都包装在底底层协议中。 构造带附件的SSOAP:SSO

37、AP封套套的创建和组组装和以前一一样,消息的的创建议和以以前一样。下下面给出心田田代码,它创创建一个MiimeBoddyPartt对象,然后后我们从附件件中读出文本本作为它的内内容体(假定定附件为一个个TXT文本本文件)。 /创建建消息 org.aapachee.soapp.messsagingg.Messsage mmsg = new oorg.appache.soap.messaaging.Messaage(); /添加附附件 if(m_attacchmentt != nnull) BufffereddReadeer atttachmeentReaader = nnew Buufferee

38、dReadder(neew FilleReadder(m_attacchmentt); StrringBuuffer buffeer = nnew SttringBBufferr(); forr(Striing liine = attacchmenttReadeer.reaadLinee(); lline != nulll; liine = attacchmenttReadeer.reaadLinee() bbufferr.appeend(liine); MimmeBodyyPart attacchmentt = neew MimmeBodyyPart(); atttachmeent.seet

39、Textt(bufffer.tooStrinng(); 接下来,我们需需要让接收端端能够引用附附件。为了使使接收端能够够分析这个消消息,我们在在XML文档档中添加了一一个元素,它它用the-attacchmentt作为hreef的值。我我们用这个值值作为附件的的conteent-idd. atttachmeent.seetHeadder(CContennt-ID, thhe-atttachmeent); 最后,我们在消消息中添加附附件部分然后后发送。Appache SOAP会会知道你在消消息中添加了了附件,并且且会正确的转转化为消息格格式: msg.adddBodyPPart(aattachh

40、ment); msg.ssend (new jjava.nnet.URRL(m_hhostURRL), UURI, eenveloope); Systeem.outt.prinntln(Sent SOAP Messaage wiith Appache HTTP SOAP Cliennt.); 接收带附件的SSOAP: /处理SOAAP体 org.apaache.ssoap.BBody bbody = requuestEnnveloppe.gettBody(); javva.utiil.Vecctor bbodyEnntriess = boody.geetBodyyEntriies(); wri

41、iter.wwrite(nBoody=n); forr (javva.utiil.Enuumerattion ee = boodyEnttries.elemeents(); e.hhasMorreElemments();) org.w3c.ddom.Ellementt el = (orgg.w3c.dom.EElemennt)e.nnextEllementt(); org.apachhe.soaap.utiil.xmll.DOM22Writeer.serrializzeAsXMML(orrg.w3cc.dom.Node)el, wwriterr); 我们通过XMLL文档中的元素来来查找附件。首

42、首先我们通过过名字查找attacchmentt元素。然然后我们取出出href属属性中的coontentt-id的值值。一旦我们们得到了idd,就能够使使用SOAPPConteext对象中中的getBBodyPaart()方方法,通过ccontennt-id来来查找MIMME附件。 org.w3cc.dom.Elemeent atttachmmentEll = (oorg.w33c.domm.Elemment)eel.gettElemeentsByyTagNaame(aattachhment).iteem(0); if (attacchmenttEl != nulll) writeer.wrii

43、te(nAttaachmennt=n); cid = attaachmenntEl.ggetAtttributte(hrref).substtring(4);/get rrid off cid: writeer.wriite(CContennt-ID = +ccid+n); MimeBBodyPaart atttachmment = requuestCoontextt.getBBodyPaart(ciid); try wwriterr.writte(Thhe atttachmeent iss.nn+atttachmeent.geetConttent()+n); catcch(Excceptio

44、on ex) tthrow new SSOAPExxceptiion(Coonstannts.FAAULT_CCODE_SSERVERR, EError writiing reesponsse, eex); elsse writeer.wriite(TThe Coontentt-ID iis nulll!n); System.out.pprintlln(wriiter.ttoStriing(); 3. 基于SOOAP的远程程过程调用(RPC) SOAP-RRPC使用SSOAP底层层结构定义了了一个用来表表示RPC以以及RPC响响应的模型。它它并不要求一一定要紧紧地地绑定一个同同步的请求/响应模

45、型或或者一个HTTTP协议。实实际上SOAAP1.1和和1.2规范范都明确声明明了SOAPP-RPC的的使用和协议议的绑定是无无关的。规范范承认,当SSOAP-RRPC绑定到到HTTP时时,RPC调调用就自动和和HTTP请请求相匹配,但但是这个匹配配纯粹是偶然然的。因此真真正重要的是是SOAP定定义了一个统统一的模型,来来表示RPCC及其一个或或多个返回值值。RPC调调用的基本要要求是,体元元素包含方法法名和参数,并并且参数可以以通过存取方方法来访问。SSOAP还提提供了对方法法签名,头数数据和代表目目的地的URRI进行编码码的方法。 我们先来看一个个SOAP-RPC的发发送端内容: POST

46、 /ssoap/sservleet/rpccrouteer HTTTP/1.00 Host: llocalhhost:55555 Contentt-Typee: texxt/xmll; chaarset=utf-88 Contentt-Lenggth: 6678 SOAPActtion: A3500001 A3500002 A3500005 可以看到,在封封套体内包含含了方法名以以及过程调用用所需的参数数。如在这个个SOAP消消息中, 是自动产产生的标签,它它代表方法名名。参数用xsii:typee=ns22:Arraay类型表表示。 SOAP-Encodding属性性 SOAP编码是是一套规

47、则,说说明线路上传传输的数据类类型如何进行行编码或者序序列化。在上上面这个消息息中,enccodinggStylee属性值设为为httpp:/scchemass.xmlssoap.oorg/sooap/enncodinng/。这这个特定的UURL定义了了基于SOAAP1.1模模式的编码规规则。SOAAP编码包括括了序列化任任何数据类型型的规则,从从简单的标量量类型到复杂杂的数据类型型。 SOAP-RPC方法法签名 方法签名只是简简单的声明body元素包含一一个SOAPP结构。结构构中的每一个个元素都可被被一个存取方方法所引用。在在SOAP中中,带有存取取方法的元素素能够直接用用命名的标签签或者

48、一个顺顺序值来标识识。如果有多多个参数,它它们必须和所所调用的方法法中的参数列列表的顺序一一致,类型也也必须匹配。响响应的规则也也是类似的。响响应端返回的的内容为: HTTP/1.1 2000 OK Set-Coookie: JSESSSIONIDD=AAD55E6B200535EDDACC766370622DF6633979; Path=/soapp Contentt-Typee: texxt/xmll; chaarset=utf-88 Contentt-Lenggth: 6696 Date: WWed, 004 Mayy 20055 14:001:35 GMT Server: Apacch

49、e-Cooyote/1.1 Connecttion: closee 54.999 19.999 36.224 SOAP-RPC的发发送和接收 下面是一个SOOAP-RPPC发送端的的代码: public doublle ggetPriiceLisst (Sttring skus) thrrows SSOAPExxceptiion, MMalforrmedURRLExceeptionn Parrameteer skuuParamm; /建建立调用 Calll calll = nnew Caall (); / 服务使用标标准的SOAAP编码 calll.settEncoddingSttyleURR

50、I(Connstantts.NS_URI_SSOAP_EENC); / 设置目标UURI call.seetTarggetObjjectURRI (uurn:exxamplees:priicelisstservvice); /设置调用方方法的名称 calll.settMethoodNamee (geetPricceListt); /创创建参数对象象 Vecctor pparamLList = new Vectoor (); Parrameteer parram = new PParameeter(sku, Striing.classs, skuss, Connstantts.NS_URI_SS

51、OAP_EENC); paramLiist.adddElemment (paramm); /设置参数 calll.settParamms (paaramLiist); /设设置Web服服务的URLL URLL url = neww URL (htttp:/llocalhhost:88080/ssoap/sservleet/rpccrouteer); /调调用Web服服务 Ressponsee respp = caall.innvoke (url, nulll); /查查看响应 if (!ressp.gennerateedFaullt() /返回结果果值 PParameeter rresultt

52、 = reesp.geetRetuurnVallue (); ddoublee pricceListt = (doubble ) ressult.ggetVallue(); rreturnn pricceListt; /查查看错误 elsse FFault f = rresp.ggetFauult(); SStringg faulltCodee = f.getFaaultCoode(); SStringg faulltStriing = f.gettFaulttStrinng(); SSystemm.err.printtln(FFault Occurrred (detaiils foollow):); SSystemm.err.printtln(FFault Code: +ffaultCCode); SSystemm.err.printtln(FFault Strinng: +faulltStriing); rreturnn nulll; public statiic voiid maiin (Sttring arggs) Sysstem.oout.prrintlnn (Prrice LList CCheckeer: SSOAP CClientt); Strring s

温馨提示

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

评论

0/150

提交评论