kSOAP的運(yùn)用(精編)_第1頁
kSOAP的運(yùn)用(精編)_第2頁
kSOAP的運(yùn)用(精編)_第3頁
kSOAP的運(yùn)用(精編)_第4頁
kSOAP的運(yùn)用(精編)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、ksoap的運(yùn)用 ksoap的運(yùn)用1.概述對(duì)于j2me訪問遠(yuǎn)端的web service,除了官方標(biāo)準(zhǔn)jsr 172,我們還有兩種選擇:1 ksoap1 wingfootwingfoot 是由 wingfoot software(www. wingfoot, com)出品的一款 j2me(cldc/cdc) soap1. 1的輕量級(jí)實(shí)現(xiàn)方案。ksoap是enhydra. org的一個(gè)開源作品,是enhydrame項(xiàng)目的一部分?;?enhydrei. org岀品的開源通用xml解析器kxml, ksoap完成了 j2me/midp平臺(tái)上 的soap解析和調(diào)用工作。stefan haustein領(lǐng)

2、導(dǎo)的ksoap開發(fā)小組于2001年5月17日推出了 alhpa版本。 之后乂經(jīng)過了一年的開發(fā),2002年6刀6日推出的ksoap 1. 2支持了 soap1. 2 規(guī)范。2003年8月25日推出的ksoap2,對(duì)soap序列化規(guī)范支持得更好了。大多數(shù)人選擇ksoap的原因是,ksoap雖然在2003年8月之后就不再維護(hù)了, 但它是open source的,很容易加入增強(qiáng)特性,比如說默認(rèn)情況k ks0ap2僅僅 支持cmnet接入點(diǎn),可以修改ks0ap2的httptransport. java代碼增加對(duì)emwap 接入點(diǎn)的支持。下載提示:ksoap當(dāng)前有兩個(gè)版本:1.2和2.0。官方網(wǎng)站:htt

3、p:/ksoeip objcctwcb org/ks0ap2. 0還有一個(gè)優(yōu)點(diǎn)是,改進(jìn)了對(duì)microsoft dotnet的兼容。以前有很多人 抱怨ksoap調(diào)用dotnet編寫的web service時(shí)遇到了不少的困擾。木章節(jié)我們將使用ksoap 2. 0的例子來講解。為了使用ksoap 2.0,必須還要下載工具包kxml2o下載提示:kxml當(dāng)前冇兩個(gè)版本:1.21和20。官方網(wǎng)站:http:/kxml. objectweb. org/kxml2比kxml更小更快。2. ks0ap2 接口讓我們先熟悉一下即將用到的ks0ap2的常用接口。接口org.ksoap2. soapenvelope

4、org. ksoap2 soapscrializationenvclopcorg. ksoap2 soapobjectorg. ksoap2. transport. httptransportsoapenvelope 對(duì)應(yīng)于 soap 規(guī)范中的 soap envelope,封裝了 head 和 body 對(duì)象。soapserial izationenvelope 是 ksoap2 新增加的類,是對(duì) soapenvelope 的擴(kuò)展, 對(duì)soap序列化(serialization)格式規(guī)范提供了支持,能夠?qū)唵螌?duì)象口動(dòng)進(jìn) 行序列化(simple object serialization) o j

5、fij ksoapl. x 則是通過 org. ksoap. classmap來做序列化的,不太好操作,也不利于擴(kuò)展。soapobject訃你自如地構(gòu)造soap調(diào)用;httptransport為你屏蔽了 internet訪問/請(qǐng)求和獲取服務(wù)器soap的細(xì)節(jié)。卜面我們通過一個(gè)最簡單的webscrvicc調(diào)用,來看看ksoap是如何做到soap 解析的:2. 1. ksoap 和 web service 之間傳遞 stringwebservice傳遞string給midp是一件很簡單的事情。首先在服務(wù)器端,不管 你是用 microsft asp. net 創(chuàng)建 webservice,還是bk to

6、mcat+axtsl. 2 支撐的 webscrvicc,都可以這么編寫主服務(wù)類:服務(wù)器端public class simpleksoapws public simpleksoapws () public string foo(string username, string password) return “ fooresult”iksoap是如何調(diào)用這個(gè)webservice的呢?首先要使用soapobjcct,這是一個(gè)高度抽象化的類,完成soap調(diào)用。可以調(diào)用 它的addproperty方法填寫要調(diào)用的webservice方法的參數(shù)。如下面代碼所示:soapobject request =

7、 new soapobject(servicenamespace, methodname);soapobject構(gòu)造函數(shù)的兩個(gè)參數(shù)含義為:servicenamespace -你的webservice的命名空間,既叫以是http: /localhost: 8088/f 1 ickrbuddy/scrviccs/buddyceist 這樣的,也可以是 urn:pl/devcentral/soapservice 這樣的; methodname -你要調(diào)用方法的名字。然后,按照webservice方法參數(shù)的順序,依次調(diào)用requestaddproperty( "username",

8、 "user");requestaddproperty( "password", "pass");來填充webservice參數(shù)。注意:建議webservice的方法傳遞的參數(shù)盡量用string類型。即使是int類型,rsoap2 與java編寫的webservice也有可能交互發(fā)生異常。對(duì)于webservice方法返回string類型的情況,還用不著開發(fā)者做序列化 (serialization)定制工作。要點(diǎn):ksoap 1. x/2. 0可以自動(dòng)把四種soap類型映射為java類型soap type java type xsd:i

9、nt java, lang. integerxsd:long java. lang. long xsd:string java. lang. stringxsd:boolean java. lang. boolean除此之外,都需要開發(fā)者自己做類型映射。然后要告訴soapscrializationenvclopc把構(gòu)造好的soapobject封裝進(jìn)去:soapserializationenvelope envelope =new soapserializationenvelope(soapenvelopever11);envelopebodyout = request;要點(diǎn):你可以通過soap

10、scrializationenvclopc或者soapenvelope的構(gòu)造函數(shù)來指明 你要用soap的哪一個(gè)規(guī)范,可以是以下幾種z-:常量 soapenvelope. verio:對(duì)應(yīng)于 soap 1. 0 規(guī)范常量 soapenvelope. ver11:對(duì)應(yīng)于 soap 1. 1 規(guī)范常量 soapenvelope. ver12:對(duì)應(yīng)于 soap 1.2 規(guī)范這樣,無論要調(diào)用的wcbservice釆用了哪一個(gè)soap規(guī)范,你都可以輕松應(yīng)對(duì)。接下來就耍聲明httptransport tx = new httptransport (serviceurl);ht debug = true;ht

11、tptransport構(gòu)造函數(shù)的參數(shù)含義為:serviceurl -要投遞soap數(shù)據(jù)的目標(biāo)地址,譬如說http:/soap amazon com/onca/soap3。httptransport 是一個(gè)強(qiáng)大的輔助類,來完成 http-call transport process, 它封裝了網(wǎng)絡(luò)請(qǐng)求的一切,你完全不用考慮序列化消息。我們通過設(shè)置它的 debug屬性為true來打開調(diào)試信息。方法httptransport. call ()自己就能夠發(fā)送請(qǐng)求給服務(wù)器、接收服務(wù)器響應(yīng)并 序列化soap消息,如下所示:ht call(null, envelope);httptransport的cal

12、1方法的兩個(gè)參數(shù)含義為:soapaction - soap規(guī)范定義了一個(gè)名為soapaction的新http標(biāo)頭,所有 soap http請(qǐng)求(即使是空的)都必須包含該標(biāo)頭。soapaction標(biāo)頭旨在表明 該消息的意圖。通??梢灾么藚?shù)為null,這樣httptransport就會(huì)設(shè)置http 標(biāo)頭soapaction為空字符串。envelope -就是前面我們構(gòu)造好的 soapserializationenvelope 或 soapenvelope 對(duì)彖。注意:對(duì)于httptransport的處理上,ksoap2和ksoapl. 2的寫法不一樣。對(duì)于 ksoap 1.2, httptran

13、sport 的構(gòu)造函數(shù)是 httptransport (string url, string soapaction),第二個(gè)參數(shù) soapaction 口j以是要調(diào)用的 webservice 方法 名。而 ksoap 2,構(gòu)造函數(shù)是 httptransport (string url) o ksoap2 相當(dāng)于把 webservice方法名分離出去,完全交給soapobject去封裝,而httptransport 僅僅負(fù)責(zé)把soapenvelope發(fā)送出去并接收響應(yīng),這樣更合理一些。調(diào)用call方法是一個(gè)同步過程,需要等待它返回。返回z后,就可以調(diào)用soapserializationenvel

14、ope的gctrcsult方法來獲取結(jié) 果了:objec t response = envelope .get resu lt();如果httptransport的debug屬性為true,那么此時(shí)就可以通過system. out. printin ("response dump>>" + tx. responsedump);打印出httptransport的調(diào)試信息。尤其當(dāng)前面cal 1方法和getresul t方法發(fā) 生異常時(shí),這個(gè)調(diào)試信息是非常有用的。前而我們的webservice方法由于是返回string,所以得到這個(gè)string值就非 常簡單了:str

15、ing sresponse 二(string)response;注意: 由于httptransport類實(shí)際上是調(diào)用了 httpconnection作網(wǎng)絡(luò)連接,所以必須 另起一個(gè)線程來專門做ksoap工作,否則會(huì)堵塞操作。綜上所述,j2me客戶端的mtdlet按鍵事件函數(shù)這么寫即可:midlet codesimport org.ksoap2. soapenvelope;import org. ksoap2. serialization. soapobject;import org. ksoap2. serialization. soapserializationenvelope;import

16、org. ksoeip2. treinsport. ilttptrvinsport;public void comma ndacti on( comma nd c, displaceable s) if (c = exitcommand)destroyapp (false);notifydestroyed();)if (c = connectcommand)/匿名內(nèi)部thread,調(diào)用ksoap2訪問遠(yuǎn)程服務(wù)。thread webservicethread 二 new thread ()public void run()trystring servicenamespace =,zhttp:/l

17、ocalhost :8080/simplews/services/simpl eksoapwsz/;string methodname 二 foo;string serviceurl 二"http:/local host:8080/simplews/services/simpleksoapws"soapobject request =new soapobject(servicenamespace, methodname);request. addproperty( username,"user");request. addproperty( "

18、password", "pass");soapserializationenvelope envelope =new soapserializationenvelope(soapenvelope. ver11);envelope. bodyout 二 request;httptransport tx = new httptransport(serviceurl);ht.debug = true;hte call(null, envelope);object response = envelope.getresult();/*必要時(shí)打印出tx. responsedu

19、mp來觀察soap是否正確工作*/system, out. println(/dump»/z + tx. responsedump);string sresponse = (string)response;丿1catch (exception e) e. printstacktrace ();webservicethread. start();)2. 2. webservice返回復(fù)雜描述的情況ks0ap2處理webscrvicc簡單的string類型返回值是很容易的。那么如何處理 像亞馬遜網(wǎng)上書丿占這種webservice返回的復(fù)雜描述呢?ks0ap2自帶了一個(gè)例子來說明,下面我們

20、就講解一下。關(guān)于亞馬遜的查詢書目的webservice,你可以通過http:/soap,n. com/schenms3/ama7onwebservices. wsdl來獲知定義。我們要關(guān)注的是它的關(guān)鍵詞查詢請(qǐng)求的方法,它的定義是:<operation name二keywordsearchrequest"><soap:operation soapaction二http:/soap, amazon, com" />input>soeip:body use二encoded"encodingstyle二http:/schemas, xmlso

21、ap. org/soap/encoding/namespace二http:/soap. amazon, com" /></input><output>soeip:body use二encoded"encodingstyle二http:/schemas, xmlsoap. org/soap/encoding/namespace二http:/soap. amazon, com" /></output> </operation> 我們捉交對(duì)包含指定關(guān)鍵詞的書目查詢,如果查詢成功,將會(huì)返回一系列書名 節(jié)點(diǎn),每一本

22、書都提供了作者、岀版社、出版日期、價(jià)格等等信息。這些書名節(jié) 點(diǎn)都在一個(gè)“details”節(jié)點(diǎn)下。查詢結(jié)果的總數(shù)放在totalresults節(jié)點(diǎn)。每 頁10個(gè)結(jié)果,口j以通過查看total pages節(jié)點(diǎn)來確定需要多少 頁。那么,ks0ap2可以很簡單地通過soapobject的gctpropcrty方法來得到書詳細(xì) 信息的節(jié)點(diǎn),存儲(chǔ)入一個(gè)vector對(duì)象中,如下所示:httptransport ht = newhttptransport("http:/soap amazon. com/onca/soap3);ht call(null, envelope);soapobject res

23、ult = (soapobject) envelope .getresult ();vector resu it vector = (vec tor) result .get property (/zde ta 訂 s");vector對(duì)象屮實(shí)際上述是存儲(chǔ)了一組soapobject對(duì)象,這里的每一個(gè) soapobject對(duì)彖對(duì)應(yīng)于一本書的d0m對(duì)彖。那么如何得到每一木書的書名、價(jià)格呢?for (int i 二 0; i resuitvector. size () ; i+) soapobject detail = (soapobject) resultvector. elementa

24、t(i);system, out. print in (,z 書名 >>"+(string)deta訂.getproperty(productname");system, out. printin ("日期»,z+(string)detail. getproperty ("releasedate");system, out. print in (,z 價(jià)格 >>"+(string) detail, getproperty(listprice");這樣就可以了。需要注意的是,要測試這個(gè)工程,必

25、須到亞馬遜的http:/w. einieizon. com/wcbscrvicc 注冊(cè)獲取 access key id, 也就是 webservice 方法屮的 “devtag” 參數(shù)所需要的 developer-tag。2. 3. webservice傳遞自定義復(fù)雜對(duì)象卜面我們講述如何在midp設(shè)備和webscrvicc z間傳遞口定義類,比如這個(gè)類中 不但冇string類型成員變量,述冇vector z類的復(fù)雜類型。大致思路就是,在服務(wù)器端將類實(shí)例按照一定規(guī)格(一個(gè)一個(gè)的成員變量寫)序 列化為byte,將這個(gè)byte數(shù)組返回給ks0ap2o ksoap2收到之后,再反序列 化,將byte

26、段一段地讀入類實(shí)例。2. 3. 1. webservice服務(wù)器端的做法我們先來定義耍傳遞的wsteam類:類定義public class wsteampri vate stri ng wsreturncode;privatc string wspcrsoncount;public stringvector wsvpersonname;public byte serialize();publ ic static wsteam deserialize(byte data);)其中,stringvector類是另外一個(gè)口定義類,就是簡單地把string封裝了一 下,便于操作。stringvecto

27、r類定義在示范代碼屮可以找到。服務(wù)器端主要是序列化,所以我們來講講wsteam的serializeo函數(shù)。wsteam的序列化函數(shù)publ ic byte serial ize() bytcarrayoutputstrcani baos = new bytcarrayoutputstrcani();dataoutputstream dos = new dataoutputstream (baos);try dos. wri teutf(wsreturncode); dos. writeutf(wspersoncount);wsvpersonname. writeobject(dos);baos

28、. close ();dos. close();)catch (exception cxc)exc.printstacktrace ();ireturn baos. tobytearray();)這樣,類實(shí)例就可以把自己序列化為byte數(shù)組。那么,webservice可以這么提供:服務(wù)器端public class simpleksoapws public simpleksoapws () )public byte foo2(string username, string password) wsteam obj二 new wsteam ();return obj. serialize();到了

29、 midp設(shè)備上,要能夠從byte恢復(fù)ill wsteam類實(shí)例才行。stringvector的序列化方法writeobject也很簡單,先寫入字符串?dāng)?shù)組的大小, 然后再將每一個(gè)元素寫入,如下所示:stringvector的序列化public class stringvectorpublic synchronized void writeobject(java io. dataoutputstream s)throws java io.loexception/ write out array lengths. wri tetnt (count);/ write out all elements

30、 in the proper orderfor (int i=0; i<count; i+)s. writeutf(datai);2. 3. 2. midp設(shè)備的做法和前面的mtdlet代碼差不多,只不過要ksoap2的marshal base64出場了。在ksoap中,我們用base64把二進(jìn)制流編碼為ascii字符串,這樣就可以通過 xml/soap傳輸二進(jìn)制數(shù)據(jù)了。org. ksoap2. serialization. marshalbase64 的目的就是,把 soap xml 中的 xsd:based64binary元素序列化為java字節(jié)數(shù)組(byete array)類型。類

31、似的, ks0ap2還提供了 marshaldate> marshalhashtable類來把相應(yīng)的元素序列化為 java 的 date、hashtable 類型。使用 marshalbase64import org. ksoap2. serialization. marshalbase64;soapobject request 二 new soapobject(servicenamespace, methodname );soapserializationenvelope envelope =new soapscrializationenvclopc(soapenvclopc. ver

32、11);envelope. bodyout = request;new marshalbase64(). register(envelope);httptransport lx = new httptransport(servicenamespace);tx.debug 二 true;tx.call (null, envelope);object response = envelope. getresulto ;將接收到的soapobject強(qiáng)制轉(zhuǎn)換為byte。轉(zhuǎn)換byte by 二(byte)response;system, out. println(succ convert!“);然后,再調(diào)用反序列化wsteam wc = wsteam. deserialize(by);這樣,在無線設(shè)備上就得到了 wsteeun類實(shí)例了。wsteam的deserialize函數(shù)是這么定義的:wsteam的反序列化函數(shù)public class stringvectorpublic static

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論