用Java實(shí)現(xiàn)基于SOAP的XML文檔網(wǎng)絡(luò)傳輸及遠(yuǎn)程過(guò)程調(diào)用(RPC)_第1頁(yè)
用Java實(shí)現(xiàn)基于SOAP的XML文檔網(wǎng)絡(luò)傳輸及遠(yuǎn)程過(guò)程調(diào)用(RPC)_第2頁(yè)
用Java實(shí)現(xiàn)基于SOAP的XML文檔網(wǎng)絡(luò)傳輸及遠(yuǎn)程過(guò)程調(diào)用(RPC)_第3頁(yè)
用Java實(shí)現(xiàn)基于SOAP的XML文檔網(wǎng)絡(luò)傳輸及遠(yuǎn)程過(guò)程調(diào)用(RPC)_第4頁(yè)
用Java實(shí)現(xiàn)基于SOAP的XML文檔網(wǎng)絡(luò)傳輸及遠(yuǎn)程過(guò)程調(diào)用(RPC)_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、用Java實(shí)現(xiàn)基于SOAP的XML文檔網(wǎng)絡(luò)傳輸及遠(yuǎn)程過(guò)程調(diào)用(RPC)SOAP(Simple Object Access Protocol,簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議) 是一種基于XML的,用于計(jì)算機(jī)之間交換信息的協(xié)議。SOAP能應(yīng)用于各種消息接發(fā)系統(tǒng),并能通過(guò)各種傳輸協(xié)議進(jìn)行消息傳遞,但最初的側(cè)重點(diǎn)是通過(guò)HTTP傳輸?shù)倪h(yuǎn)程過(guò)程調(diào)用。SOAP是Web service的一個(gè)重要組成部份,如果把Web service比喻成Internet,那么SOAP就可以比喻成TCP/IP。SOAP是一種協(xié)議而非具體產(chǎn)品,微軟也有自己的SOAP實(shí)現(xiàn)產(chǎn)品,而Java下比較流行的SOAP實(shí)現(xiàn)產(chǎn)品就是Apache SOAP,不

2、過(guò)它的下一個(gè)版本已經(jīng)改名成AXIS了。 SOAP是用XML文件來(lái)做為數(shù)據(jù)轉(zhuǎn)輸?shù)妮d體的,走HTTP的線路。一般企業(yè)的防火墻都開放HTTP的80端口,所以SOAP不會(huì)被防火墻阻斷,這算是SOAP的一個(gè)優(yōu)點(diǎn)。信息轉(zhuǎn)輸?shù)碾p方都要求支持SOAP服務(wù),因?yàn)閄ML文件發(fā)過(guò)去,則對(duì)方需要有SOAP服務(wù)來(lái)接收,然后對(duì)方會(huì)有反饋也是XML文件,這時(shí)你也需要安裝SOAP服務(wù)來(lái)接收。 1. 環(huán)境配置置 為了運(yùn)行程序,我我們首先必須須配置好環(huán)境境: 共要下載四個(gè)軟軟件包,它們們都是開源免免費(fèi)的。其中中,前兩個(gè)是是Apachhe的,后兩兩個(gè)是SUNN網(wǎng)站的,如如下所示: 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 下載后將它們分分別解壓縮。分別在這四個(gè)包的解壓目錄中找到:xerces.jar、soap.jar、mail.jar、activation.jar(JAF的),則是四個(gè)jar文件是我們所需要的。 本機(jī)安裝環(huán)境:WindoowsXP(S

4、P2) + JDKK1.4.22_06 + Tomccat5.00.28 + SOAPP2.3.11 配置步驟: 1、安裝JDKK和Tomccat。過(guò)程程比較簡(jiǎn)單,這這里不再詳述述。 2、將剛才所找找到的四個(gè)jjar文件復(fù)復(fù)制到Tommcat的“Tomcaat 5.00commmonliib”目錄下,這這個(gè)目錄是TTomcatt的默認(rèn)包目目錄,在這個(gè)個(gè)目錄中的所所有包在Toomcat啟啟動(dòng)時(shí)都會(huì)被被自動(dòng)加載。 3、將 JDDK1.4.2libb路徑下的的toolss.jar也也復(fù)制到Toomcat的的“Tomcaat 5.00commmonliib”目錄下。 4、將soapp解壓目錄的的web

5、appps目錄下下的soapp.war文文件,復(fù)制到到Tomcaat的“Tomcaat 5.00webaapps”目錄下,這這個(gè)目錄是TTomcatt的WEB應(yīng)應(yīng)用所在目錄錄。重新啟動(dòng)動(dòng)Tomcaat,Tommcat會(huì)自自動(dòng)將其解壓壓,并配置好好路徑。可以以嘗試在瀏覽覽器中輸入“http:/loccalhosst:80880/soaap/”, 看SOOAP是否安安裝好。 5、注意在編寫寫程序時(shí),需需要將所得到到的四個(gè)jaar文件路徑徑設(shè)置到所使使用的Javva編程環(huán)境境中,因?yàn)樵谠诔绦蛑行枰玫狡渲械牡念愇募?。具具體步驟略。 6、重啟Tommcat服務(wù)務(wù)。這時(shí)Toomcat會(huì)會(huì)將“Tomca

6、at 5.00commmonliib”目錄下新加加入的包加載載到內(nèi)存中。 到此,我們已經(jīng)經(jīng)配置好了程程序運(yùn)行所需需要的環(huán)境。 2. 基于SOOAP的XMML文檔網(wǎng)絡(luò)絡(luò)傳輸 SOAP規(guī)范主主要定義了四四個(gè)元素:SSOAP信封封規(guī)范,傳輸輸和協(xié)議綁定定,編碼規(guī)則則和一個(gè)RPPC協(xié)定。用用于實(shí)現(xiàn)消息息的網(wǎng)絡(luò)傳輸輸。 SOAPP信封規(guī)范,SSOAP信封封規(guī)范對(duì)計(jì)算算機(jī)間傳遞的的數(shù)據(jù)如何封封裝定義了具具體的規(guī)則。這這包括應(yīng)用特特定的數(shù)據(jù),如如要調(diào)用的方方法名,方法法參數(shù)和返回回值;還包括括誰(shuí)將處理封封裝內(nèi)容,失失敗時(shí)如何編編碼錯(cuò)誤消息息等信息。 數(shù)據(jù)編碼碼規(guī)則,為了了交換數(shù)據(jù),計(jì)計(jì)算機(jī)必須在在編碼特定數(shù)

7、數(shù)據(jù)類型的規(guī)規(guī)則上達(dá)成一一致,SOAAP也有自己己的一套編碼碼數(shù)據(jù)類型的的約定。大部部分約定都基基于W3C XML SSchemaa規(guī)范。 RPC協(xié)協(xié)定,SOAAP能用于單單向和雙向等等各種消息接接發(fā)系統(tǒng)。SSOAP為雙雙向消息接發(fā)發(fā)定義了一個(gè)個(gè)簡(jiǎn)單的協(xié)定定來(lái)進(jìn)行遠(yuǎn)程程過(guò)程調(diào)用和和響應(yīng),這使使得客戶端應(yīng)應(yīng)用可以指定定遠(yuǎn)程方法名名,獲取任意意多個(gè)參數(shù)并并接受來(lái)自服服務(wù)器的響應(yīng)應(yīng)。 傳輸和協(xié)協(xié)議綁定,提提供了更底層層協(xié)議傳輸SSOAP封套套的一套通用用機(jī)制。 而以上四個(gè)部分分統(tǒng)稱為一個(gè)個(gè)SOAP消消息。我們先先來(lái)看一篇XXML文檔是是如何變成SSOAP的。采采用一個(gè)簡(jiǎn)單單的購(gòu)物訂單單文件PO.xm

8、l 。內(nèi)內(nèi)容為: Joe Smithh 144 Oak Park Bedfford MA 017300 CCandy Caness 444 1.68 I wannt canndy! 其對(duì)應(yīng)的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! 一個(gè)SOAP消消息包括:SSOAP封套套,SOAPP頭(可選),SOAPP主體。 我們首先將XMML文檔包裝裝到一個(gè)SOOAP體中,然然后再把SOOAP體包裝裝到一個(gè)SOOAP封套中中,可以在封封套中再添加加一個(gè)SOAAP頭(不是是必須),最最后將SOAAP封套綁定定到一個(gè)協(xié)議議中。我們來(lái)來(lái)仔細(xì)分析一一下代碼。 SOAP封封套 SOAP封套的的聲明在XMML標(biāo)簽的最最外層,它表表明了一個(gè)SSOAP文檔檔的邊界。下下面的封套標(biāo)標(biāo)簽顯示了三三個(gè)必要的屬屬性,這

10、些屬屬性指明了封封套中使用的的名字空間和和語(yǔ)法。 其中第一個(gè)屬性性:xmlnns:SOAAP-ENVV=htttp:/ssoap/eenveloope/ 是一個(gè)名字字空間聲明,防防止多個(gè)XMML文件組合合時(shí)發(fā)生標(biāo)簽簽名字的沖突突。第二個(gè)屬屬性聲明了XXML模式實(shí)實(shí)例的名字空空間。前綴xxsi必須放放在這個(gè)名字字空間定義的的所有元素和和屬性之前。最最后一個(gè)屬性性是另外一個(gè)個(gè)名字空間聲聲明,它定義義了XML Schemma名字空間間,這個(gè)名字字空間下的元元素用來(lái)指定定xsi:ttype 屬屬性的值(如如xsd:sstringg)。 SOAP頭頭 SOAAP頭和體在在語(yǔ)法上非常常類似。SOOAP1.

11、11和SOAPP1.2都沒(méi)沒(méi)有頭里應(yīng)該該有些什么,它它就是簡(jiǎn)單的的存放一些指指令,提供給給接收消息的的SOAP處處理器。建立立在SOAPP之上的更高高級(jí)協(xié)議(比比如ebXMML消息服務(wù)務(wù))就通過(guò)定定義一些特殊殊元素來(lái)規(guī)范范SOAP頭頭的格式。另另外當(dāng)對(duì)RPPC使用SOOAP時(shí),頭頭部也可以用用來(lái)表示一些些底層信息。 MeYou99999 SOAP主主體 SOAP主體用用來(lái)存放實(shí)際際數(shù)據(jù)或消息息的有效負(fù)載載(本例中為為XML文檔檔),從而提提供給最終的的接受者使用用或處理。 SOAP協(xié)協(xié)議綁定 當(dāng)綁定到一個(gè)HHTTP協(xié)議議時(shí),需要在在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或者沒(méi)沒(méi)有解析SOOAP封套的的方法。而在在SOAP11.2中SOOAPActtion已變變成可選的了了。

13、SOAP消消息的發(fā)送與與接收 我們已經(jīng)看到了了一個(gè)SOAAP消息的各各個(gè)組成塊,接接下來(lái)我們要要了解消息是是怎樣被創(chuàng)建建的,以及怎怎樣在兩個(gè)端端點(diǎn)之間進(jìn)行行傳輸?shù)摹?SOAP的發(fā)送送端的代碼: 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(); /實(shí)際的傳傳送工作是由由sendSSOAPMeessagee()方法完完成的 pubblic vvoid ssendSOOAPMesssage() try / 首先讀讀取XML文文檔,將其解解析成DOMM樹。 FileRReaderr fr = new FileRReaderr (m_ddataFiileNamme); /通過(guò)調(diào)用AApachee getXXMlDoccBuildder()方方法得到一個(gè)個(gè)解析器,它它返回一個(gè)DDocumeentBuiilder對(duì)對(duì)象。 javaxx.xml.parseers.Dooc

17、umenntBuillder xxdb = oorg.appache.soap.util.xml.XXMLParrserUttils.ggetXMLLDocBuuilderr(); /通過(guò)解析器器解析文檔,得得到一個(gè)Doocumennt對(duì)象。 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元元素,放到向向量中。頂層層節(jié)點(diǎn)的下層層節(jié)點(diǎn)元素的的創(chuàng)建和添加加工作由DOOM解析器負(fù)負(fù)責(zé)。 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.); / 從傳傳輸中接受響響應(yīng)并將其打打印到屏幕上上 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) /省略略 在上述程序中,當(dāng)當(dāng)我們構(gòu)造好好SOAP封封套后,它需需要被送到一一個(gè)目的地去去。在ApaacheSOOAP中,有有一個(gè)Messsage對(duì)對(duì)象來(lái)處理異異步的單向傳傳送。Messsage.send()方法有三三個(gè)參數(shù):一一個(gè)URL,用用于指明傳送送地點(diǎn);一個(gè)個(gè)URI,用用于表示SOOAPActtion頭的的值;還有一一個(gè)SOAPP封套。SOOAPActtionURRI實(shí)際上是是綁定HTTTP的一部分分,用來(lái)指定定當(dāng)一個(gè)消

27、息息到達(dá)傳送目目的地的時(shí)候候調(diào)用哪個(gè)函函數(shù)或服務(wù)。 Messagee接口用于異異步單向通信信,Messsage.sseng()函數(shù)的返回回值為voiid型。但這這并不妨礙它它在雙向同步步會(huì)話中使用用。當(dāng)這個(gè)MMessagge接口是基基于一個(gè)雙向向傳輸協(xié)議(例如HTTTP)實(shí)現(xiàn)的的時(shí)候,SOOAPTraansporrt.recceive()方法就能能用來(lái)接收一一個(gè)響應(yīng)。在在SOAPTTranspport是基基于HTTPP實(shí)現(xiàn)的情況況下,recceive()方法阻塞塞并等待一個(gè)個(gè)錯(cuò)誤(例如如一個(gè)HTTTP請(qǐng)求超時(shí)時(shí)),或者一一個(gè)正確的返返回代碼(例例如“HTTP 1.0 2200 OKK”)。 S

28、OAP接收端端代碼: public classs HTTPPReceiive exxtendss HttppServllet . /SSOAP請(qǐng)求求以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(); / 接下來(lái)來(lái)我們將文件件解析為一個(gè)個(gè)DOM樹,得得到一個(gè)Doocumennt對(duì)象

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 /在接收端我我們已經(jīng)

32、有了了一個(gè)發(fā)送過(guò)過(guò)來(lái)的SOAAP封套。SSOAP封套套是SOAPP文檔的最外外層元素,也也是根元素。我我們可以遍歷歷這個(gè)DOMM樹從而直接接得到封套以以及它的子節(jié)節(jié)點(diǎn)。通過(guò)調(diào)調(diào)用unmaarshalll()方法法從文件中得得到一個(gè)Ennveloppe實(shí)例。 orrg.apaache.ssoap.EEnveloope ennv = orgg.apacche.sooap.Ennveloppe.unmmarshaall(dooc.gettDocummentEllementt(); / 現(xiàn)在我們們得到了一個(gè)個(gè)封套,我們們按照和前面面相反的過(guò)程程來(lái)操作它:從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(); /在當(dāng)前前情況下,向向量中只有一一個(gè)條目:元元素。從而我我們也就得到到了一個(gè)DOOM對(duì)象。這這個(gè)DOM對(duì)對(duì)象和前面我我們?yōu)榻PO.xmll而建立的DDOM對(duì)象完完全一樣。我我們調(diào)用靜態(tài)態(tài)方法DOMM2Writter.seerialiizeAsXXML()將將PurchhaseOrrder元素素及其子元素素全部序列化化為一個(gè)SttringWWriterr對(duì)象。 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能夠很好好的描述數(shù)據(jù)據(jù),但是許多

36、多應(yīng)用程序的的數(shù)據(jù)并不適適合XML來(lái)來(lái)描述,比如如圖像的二進(jìn)進(jìn)制數(shù)據(jù)。SSWA(SOOAP Wiith Atttachmments)可可以解決這個(gè)個(gè)問(wèn)題。SWWA把SOAAP協(xié)議和MMIME格式式組合到一起起,從而使SSOAP消息息可以包含任任意的數(shù)據(jù)。這這個(gè)模型和在在emaill中包含附件件的方法是一一樣的。 MIME協(xié)議允允許在消息中中包含任意多多個(gè)數(shù)據(jù)塊。每每個(gè)數(shù)據(jù)塊都都被一個(gè)MIIME頭分開開。在SWAA中,整個(gè)消消息包含多個(gè)個(gè)MIME部部分,第一部部分(部分00)是SOAAP封套,剩剩下的部分(1- n)都是附件。所所有這些部分分都包裝在底底層協(xié)議中。 構(gòu)造帶附件的SSOAP:SSO

37、AP封套套的創(chuàng)建和組組裝和以前一一樣,消息的的創(chuàng)建議和以以前一樣。下下面給出心田田代碼,它創(chuàng)創(chuàng)建一個(gè)MiimeBoddyPartt對(duì)象,然后后我們從附件件中讀出文本本作為它的內(nèi)內(nèi)容體(假定定附件為一個(gè)個(gè)TXT文本本文件)。 /創(chuàng)建建消息 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(); 接下來(lái),我們需需要讓接收端端能夠引用附附件。為了使使接收端能夠夠分析這個(gè)消消息,我們?cè)谠赬ML文檔檔中添加了一一個(gè)元素,它它用the-attacchmentt作為hreef的值。我我們用這個(gè)值值作為附件的的conteent-idd. atttachmeent.seetHeadder(CContennt-ID, thhe-atttachmeent); 最后,我們?cè)谙⒅刑砑痈礁郊糠秩缓蠛蟀l(fā)送。Appache SOAP會(huì)會(huì)知道你在消消息中添加了了附件,并且且會(huì)正確的轉(zhuǎn)轉(zhuǎn)化為消息格格式: 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); 我們通過(guò)XMLL文檔中的元素來(lái)來(lái)查找附件。首

42、首先我們通過(guò)過(guò)名字查找attacchmentt元素。然然后我們?nèi)〕龀鰄ref屬屬性中的coontentt-id的值值。一旦我們們得到了idd,就能夠使使用SOAPPConteext對(duì)象中中的getBBodyPaart()方方法,通過(guò)ccontennt-id來(lái)來(lái)查找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的遠(yuǎn)程程過(guò)程調(diào)用(RPC) SOAP-RRPC使用SSOAP底層層結(jié)構(gòu)定義了了一個(gè)用來(lái)表表示RPC以以及RPC響響應(yīng)的模型。它它并不要求一一定要緊緊地地綁定一個(gè)同同步的請(qǐng)求/響應(yīng)模

45、型或或者一個(gè)HTTTP協(xié)議。實(shí)實(shí)際上SOAAP1.1和和1.2規(guī)范范都明確聲明明了SOAPP-RPC的的使用和協(xié)議議的綁定是無(wú)無(wú)關(guān)的。規(guī)范范承認(rèn),當(dāng)SSOAP-RRPC綁定到到HTTP時(shí)時(shí),RPC調(diào)調(diào)用就自動(dòng)和和HTTP請(qǐng)請(qǐng)求相匹配,但但是這個(gè)匹配配純粹是偶然然的。因此真真正重要的是是SOAP定定義了一個(gè)統(tǒng)統(tǒng)一的模型,來(lái)來(lái)表示RPCC及其一個(gè)或或多個(gè)返回值值。RPC調(diào)調(diào)用的基本要要求是,體元元素包含方法法名和參數(shù),并并且參數(shù)可以以通過(guò)存取方方法來(lái)訪問(wèn)。SSOAP還提提供了對(duì)方法法簽名,頭數(shù)數(shù)據(jù)和代表目目的地的URRI進(jìn)行編碼碼的方法。 我們先來(lái)看一個(gè)個(gè)SOAP-RPC的發(fā)發(fā)送端內(nèi)容: 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 可以看到,在封封套體內(nèi)包含含了方法名以以及過(guò)程調(diào)用用所需的參數(shù)數(shù)。如在這個(gè)個(gè)SOAP消消息中, 是自動(dòng)產(chǎn)產(chǎn)生的標(biāo)簽,它它代表方法名名。參數(shù)用xsii:typee=ns22:Arraay類型表表示。 SOAP-Encodding屬性性 SOAP編碼是是一套規(guī)

47、則,說(shuō)說(shuō)明線路上傳傳輸?shù)臄?shù)據(jù)類類型如何進(jìn)行行編碼或者序序列化。在上上面這個(gè)消息息中,enccodinggStylee屬性值設(shè)為為httpp:/scchemass.xmlssoap.oorg/sooap/enncodinng/。這這個(gè)特定的UURL定義了了基于SOAAP1.1模模式的編碼規(guī)規(guī)則。SOAAP編碼包括括了序列化任任何數(shù)據(jù)類型型的規(guī)則,從從簡(jiǎn)單的標(biāo)量量類型到復(fù)雜雜的數(shù)據(jù)類型型。 SOAP-RPC方法法簽名 方法簽名只是簡(jiǎn)簡(jiǎn)單的聲明body元素包含一一個(gè)SOAPP結(jié)構(gòu)。結(jié)構(gòu)構(gòu)中的每一個(gè)個(gè)元素都可被被一個(gè)存取方方法所引用。在在SOAP中中,帶有存取取方法的元素素能夠直接用用命名的標(biāo)簽簽或者

48、一個(gè)順順序值來(lái)標(biāo)識(shí)識(shí)。如果有多多個(gè)參數(shù),它它們必須和所所調(diào)用的方法法中的參數(shù)列列表的順序一一致,類型也也必須匹配。響響應(yīng)的規(guī)則也也是類似的。響響應(yīng)端返回的的內(nèi)容為: 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的發(fā)發(fā)送和接收 下面是一個(gè)SOOAP-RPPC發(fā)送端的的代碼: public doublle ggetPriiceLisst (Sttring skus) thrrows SSOAPExxceptiion, MMalforrmedURRLExceeptionn Parrameteer skuuParamm; /建建立調(diào)用 Calll calll = nnew Caall (); / 服務(wù)使用標(biāo)標(biāo)準(zhǔn)的SOAAP編碼 calll.settEncoddingSttyleURR

50、I(Connstantts.NS_URI_SSOAP_EENC); / 設(shè)置目標(biāo)UURI call.seetTarggetObjjectURRI (uurn:exxamplees:priicelisstservvice); /設(shè)置調(diào)用方方法的名稱 calll.settMethoodNamee (geetPricceListt); /創(chuàng)創(chuàng)建參數(shù)對(duì)象象 Vecctor pparamLList = new Vectoor (); Parrameteer parram = new PParameeter(sku, Striing.classs, skuss, Connstantts.NS_URI_SS

51、OAP_EENC); paramLiist.adddElemment (paramm); /設(shè)置參數(shù) calll.settParamms (paaramLiist); /設(shè)設(shè)置Web服服務(wù)的URLL URLL url = neww URL (htttp:/llocalhhost:88080/ssoap/sservleet/rpccrouteer); /調(diào)調(diào)用Web服服務(wù) Ressponsee respp = caall.innvoke (url, nulll); /查查看響應(yīng) if (!ressp.gennerateedFaullt() /返回結(jié)果果值 PParameeter rresultt

52、 = reesp.geetRetuurnVallue (); ddoublee pricceListt = (doubble ) ressult.ggetVallue(); rreturnn pricceListt; /查查看錯(cuò)誤 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論