Android調用WebService – Android移動開發技術文章_手機開發 Android移動開發教學課程

WebService是一種基於SOAP協議的遠程調用標準,通過webservice可以將不同操作系統平臺、不同語言、不同技術整合到一塊。在Android SDK中並沒有提供調用WebService的庫,因此,需要使用第三方的SDK來調用WebService。PC版本的WEbservice客戶端庫非常豐富,例如Axis2,CXF等,但這些開發包對於Android系統過於龐大,也未必很容易移植到Android系統中。因此,這些開發包並不是在我們的考慮范圍內。適合手機的WebService客戶端的SDK有一些,比較常用的有Ksoap2,可以從http://code.google.com/p/ksoap2-android/downloads/list進行下載;將下載的ksoap2-android-assembly-2.4-jar-with-dependencies.jar包復制到Eclipse工程的lib目錄中,當然也可以放在其他的目錄裡。同時在Eclipse工程中引用這個jar包。


具體調用調用webservice的方法為:


(1) 指定webservice的命名空間和調用的方法名,如:


SoapObject request =new SoapObject(http://service,”getName”);
 


SoapObject類的第一個參數表示WebService的命名空間,可以從WSDL文檔中找到WebService的命名空間。第二個參數表示要調用的WebService方法名。


(2) 設置調用方法的參數值,如果沒有參數,可以省略,設置方法的參數值的代碼如下:


Request.addProperty(“param1”,”value”);
Request.addProperty(“param2”,”value”);
 


要註意的是,addProperty方法的第1個參數雖然表示調用方法的參數名,但該參數值並不一定與服務端的WebService類中的方法參數名一致,隻要設置參數的順序一致即可。


(3) 生成調用Webservice方法的SOAP請求信息。該信息由SoapSerializationEnvelope對象描述,代碼為:


SoapSerializationEnvelope envelope=new
SoapSerializationEnvelope(SoapEnvelope.VER11);
Envelope.bodyOut = request;
 


創建SoapSerializationEnvelope對象時需要通過SoapSerializationEnvelope類的構造方法設置SOAP協議的版本號。該版本號需要根據服務端WebService的版本號設置。在創建SoapSerializationEnvelope對象後,不要忘瞭設置SOAPSoapSerializationEnvelope類的bodyOut屬性,該屬性的值就是在第一步創建的SoapObject對象。


(4) 創建HttpTransportsSE對象。通過HttpTransportsSE類的構造方法可以指定WebService的WSDL文檔的URL:


HttpTransportSE ht=new HttpTransportSE(“http://192.168.18.17:80
/axis2/service/SearchNewsService?wsdl”);
 


(5)使用call方法調用WebService方法,代碼:


ht.call(null,envelope);
 


Call方法的第一個參數一般為null,第2個參數就是在第3步創建的SoapSerializationEnvelope對象。


(6)使用getResponse方法獲得WebService方法的返回結果,代碼:


SoapObject soapObject =( SoapObject) envelope.getResponse();
 


以下為簡單的實現一個天氣查看功能的例子:


public class WebService extends Activity { 
private static final String NAMESPACE = “http://WebXml.com.cn/”; 
// WebService地址 
private static String URL = “http://www.webxml.com.cn/
webservices/weatherwebservice.asmx”; 
private static final String METHOD_NAME = “getWeatherbyCityName”; 
private static String SOAP_ACTION = “http://WebXml.com.cn/
getWeatherbyCityName”; 


private String weatherToday; 


private Button okButton; 
private SoapObject detail; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.main); 
  okButton = (Button) findViewById(R.id.ok); 


  okButton.setOnClickListener(new Button.OnClickListener() { 
   public void onClick(View v) { 
   showWeather(); 
   } 
  }); 


private void showWeather() { 
  String city = “武漢”; 
  getWeather(city); 


@SuppressWarnings(“deprecation”) 
public void getWeather(String cityName) { 
try { 
 System.out.println(“rpc——“); 
  SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME); 
  System.out.println(“rpc” + rpc); 
  System.out.println(“cityName is ” + cityName); 
 rpc.addProperty(“theCityName”, cityName); 


  AndroidHttpTransport ht = new AndroidHttpTransport(URL); 
  ht.debug = true; 


SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( 
    SoapEnvelope.VER11); 


  envelope.bodyOut = rpc; 
  envelope.dotNet = true; 
 envelope.setOutputSoapObject(rpc); 


  ht.call(SOAP_ACTION, envelope); 


 SoapObject result = (SoapObject) envelope.bodyIn; 
  detail = (SoapObject) result 
    .getProperty(“getWeatherbyCityNameResult”); 


  System.out.println(“result” + result); 
  System.out.println(“detail” + detail); 
  Toast.makeText(WebService.this, detail.toString(), 
   Toast.LENGTH_LONG).show(); 
  parseWeather(detail); 


  return; 
} catch (Exception e) { 
  e.printStackTrace(); 
  } 


private void parseWeather(SoapObject detail) 
   throws UnsupportedEncodingException { 
  String date = detail.getProperty(6).toString(); 
  weatherToday = “今天:” + date.split(” “)[0]; 
  weatherToday = weatherToday + ”
天氣:” + date.split(” “)[1]; 
  weatherToday = weatherToday + ”
氣溫:” 
    + detail.getProperty(5).toString(); 
 weatherToday = weatherToday + ”
風力:” 
    + detail.getProperty(7).toString() + ”
“; 
  System.out.println(“weatherToday is ” + weatherToday); 
  Toast.makeText(WebService.this, weatherToday,
  Toast.LENGTH_LONG).show(); 


 } 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *