Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> android中soap協議使用(ksoap調用webservice)

android中soap協議使用(ksoap調用webservice)

編輯:Android開發實例

如下面代碼所示:
代碼如下:

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工作,否則會堵塞操作。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved