Android SOAP協議學習中(一)

這個項目用到了android soap協議,簡單說一下本身的心得,這也是從網上看資料學到的,java

copy開始--------android

kSOAP是如何調用這個webservice的呢? 
首先要使用SoapObject,這是一個高度抽象化的類,完成SOAP調用。能夠調用它的addProperty方法填寫要調用的webservice方法的參數。以下面代碼所示: 
SoapObject request  = new SoapObject(serviceNamespace, methodName); 
SoapObject構造函數的兩個參數含義爲: 
serviceNamespace – 你的webservice的命名空間,既能夠是 
http://localhost:8088/flickrBuddy/services/Buddycast這樣的,也能夠是 
urn:PI/DevCentral/SoapService這樣的; 
methodName – 你要調用方法的名字。 
而後,按照webservice方法參數的順序,依次調用 
request.addProperty( "username", "user" ); 
request.addProperty( "password", "pass" ); 
來填充webservice參數。 
注意: 
建議webservice的方法傳遞的參數儘可能用string類型。即便是int類型,kSOAP2與Java編寫的webservice也有可能交互發生異常。 
對於webservice方法返回String類型的狀況,還用不着開發者作序列化(Serialization)定製工做。 
要點: 
kSOAP 1.X/2.0能夠自動把四種SOAP類型映射爲Java類型 
SOAP type Java type 
xsd:int  java.lang.Integer 
xsd:long  java.lang.Long 
xsd:string  java.lang.String 
xsd:boolean java.lang.Boolean 
除此以外,都須要開發者本身作類型映射。 
而後要告訴SoapSerializationEnvelope把構造好的SoapObject封裝進去: 
SoapSerializationEnvelope envelope = 
new SoapSerializationEnvelope(SoapEnvelope.VER11); 
envelope.bodyOut = request; 
要點: 
你能夠經過SoapSerializationEnvelope或者SoapEnvelope的構造函數來指明你要用SOAP的哪個規範,能夠是如下幾種之一: 
常量SoapEnvelope.VER10:對應於SOAP 1.0規範 
常量SoapEnvelope.VER11:對應於SOAP 1.1規範 
常量SoapEnvelope.VER12:對應於SOAP 1.2規範 
這樣,不管要調用的webservice採用了哪個SOAP規範,你均可以輕鬆應對。 
接下來就要聲明 
HttpTransport tx = new HttpTransport(serviceURL); 
ht.debug = true; 
HttpTransport構造函數的參數含義爲: 
serviceURL – 要投遞SOAP數據的目標地址,譬如說 
http://soap.amazon.com/onca/soap3 。 
HttpTransport是一個強大的輔助類,來完成Http-call transport process,它封裝了網絡請求的一切,你徹底不用考慮序列化消息。咱們經過設置它的debug屬性爲true來打開調試信息。 
方法HttpTransport.call()本身就可以發送請求給服務器、接收服務器響應並序列化SOAP消息,以下所示: 
ht.call(null, envelope); 
HttpTransport的call方法的兩個參數含義爲: 
soapAction – SOAP 規範定義了一個名爲 SOAPAction 的新 HTTP 標頭,全部 SOAP HTTP 請求(即便是空的)都必須包含該標頭。 SOAPAction 標頭旨在代表該消息的意圖。一般能夠置此參數爲null,這樣HttpTransport就會設置HTTP標頭SOAPAction爲空字符串。 
Envelope – 就是前面咱們構造好的SoapSerializationEnvelope或SoapEnvelope對象。 
注意: 
對於HttpTransport的處理上,kSOAP2和kSOAP1.2的寫法不同。 
對於kSOAP 1.2,HttpTransport的構造函數是HttpTransport (String url, String soapAction),第二個參數soapAction能夠是要調用的webservice方法名。 
而kSOAP 2,構造函數是 HttpTransport(String url)。kSOAP2至關於把webservice方法名分離出去,徹底交給SoapObject去封裝,而HttpTransport僅僅負責把 SoapEnvelope發送出去並接收響應,這樣更合理一些。
調用call方法是一個同步過程,須要等待它返回。 
返回以後,就能夠調用SoapSerializationEnvelope的getResult方法來獲取結果了: 
Object Response = envelope.getResult(); 
若是HttpTransport的debug屬性爲true,那麼此時就能夠經過 
System.out.println("Response dump>>" + tx.responseDump); 
打印出HttpTransport的調試信息。尤爲當前面call方法和getResult方法發生異常時,這個調試信息是很是有用的。 
前面咱們的webservice方法因爲是返回string,因此獲得這個string值就很是簡單了: 
String sResponse = (String)Response; 
注意: 
因爲HttpTransport類其實是調用了HttpConnection做網絡鏈接,因此必須另起一個線程來專門作kSOAP工做,不然會堵塞操做。 web

copy結束------服務器

如今開始學呢,歡迎更多人的指導和建議。網絡

相關文章
相關標籤/搜索