Android使用ksoap2-android调用WebService学习

转自 Android使用ksoap2-android调用WebService学习

之前主要做客户端UI交互,很少处理数据和接触服务端,但现在的移动设备根本不可能离得开网络连接,数据的交换。最近学习的是在android端如何去调用远程WebService,都说WebService是一种基于SOAP协议的远程调用标准,对于这个协议理解不深,知道webservice可以将不同操作系统平台、不同语言、不同技术整合到一块,android SDK没有直接调用webservice的库,最常用的是借助ksoap2-android这个第三方SDK,点击打开链接,然后和其他第三方jar包一样导入android项目中即可。

对于WebService服务器具体的编写,现阶段自己不了解,暂且使用网络免费的WebService进行学习http://www.webxml.com.cn/zh_cn/index.aspx,利用这个来写一个简单的国内天气预报的查询,代码编写参照《疯狂Android讲义》相关部分,自己做部分修改。

-------------------------------------------------------------------------------------------------------------

以下是几个主要的方法:

1.创建HttpTransportSE传输对象:HttpTransportSE ht = new HttpTransportSE(SERVICE_URL); SERVICE_URL是webservice提供服务的url

2.使用SOAP1.1协议创建Envelop对象:SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 设置SOAP协议的版本号,根据服务端WebService的版本号设置。

3.实例化SoapObject对象:SoapObject soapObject = new SoapObject(SERVICE_NAMESPACE, methodName); 第一个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。第二个参数表示要调用的WebService方法名。

4.设置调用方法的参数值,如果没有参数,可以省略:例如soapObject.addProperty("theCityCode", cityName);

5.记得设置bodyout属性 envelope.bodyOut = soapObject;

6.调用webservice:ht.call(SERVICE_NAMESPACE+methodName, envelope);

7.获取服务器响应返回的SOAP消息:

SoapObject result = (SoapObject) envelope.bodyIn;
     SoapObject detail = (SoapObject) result.getProperty(methodName+"Result");

-------------------------------------------------------------------------------------------------------------

在这个天气预报的demo中需要多次调用webservice,将方法写在一个工具类中,代码如下:

[java] view plaincopy

  1. <span style="font-family:Comic Sans MS;font-size:18px;">package com.example.webservicedemo;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import org.ksoap2.SoapEnvelope;
  6. import org.ksoap2.SoapFault;
  7. import org.ksoap2.serialization.SoapObject;
  8. import org.ksoap2.serialization.SoapSerializationEnvelope;
  9. import org.ksoap2.transport.HttpTransportSE;
  10. import org.xmlpull.v1.XmlPullParserException;
  11. public class WebServiceUtil {
  12. // 定义webservice的命名空间
  13. public static final String SERVICE_NAMESPACE = "http://WebXml.com.cn/";
  14. // 定义webservice提供服务的url
  15. public static final String SERVICE_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
  16. // 调用远程webservice获取省份列表
  17. public static List<String> getProvinceList() {
  18. // 调用 的方法
  19. String methodName = "getRegionProvince";
  20. // 创建HttpTransportSE传输对象
  21. HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
  22. try {
  23. ht.debug = true;
  24. // 使用SOAP1.1协议创建Envelop对象
  25. SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
  26. SoapEnvelope.VER11);
  27. // 实例化SoapObject对象
  28. SoapObject soapObject = new SoapObject(SERVICE_NAMESPACE,
  29. methodName);
  30. envelope.bodyOut = soapObject;
  31. // 设置与.NET提供的webservice保持较好的兼容性
  32. envelope.dotNet = true;
  33. // 调用webservice
  34. ht.call(SERVICE_NAMESPACE + methodName, envelope);
  35. if (envelope.getResponse() != null) {
  36. // 获取服务器响应返回的SOAP消息
  37. SoapObject result = (SoapObject) envelope.bodyIn;
  38. SoapObject detail = (SoapObject) result.getProperty(methodName
  39. + "Result");
  40. // 解析服务器响应的SOAP消息
  41. return parseProvinceOrCity(detail);
  42. }
  43. } catch (SoapFault e) {
  44. // TODO Auto-generated catch block
  45. e.printStackTrace();
  46. } catch (IOException e) {
  47. // TODO Auto-generated catch block
  48. e.printStackTrace();
  49. } catch (XmlPullParserException e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. }
  53. return null;
  54. }
  55. // 根据省份获取城市列表
  56. public static List<String> getCityListsByProvince(String province) {
  57. // 调用的方法
  58. String methodName = "getSupportCityString";
  59. // 创建httptransportSE传输对象
  60. HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
  61. ht.debug = true;
  62. // 实例化SoapObject对象
  63. SoapObject soapObject = new SoapObject(SERVICE_NAMESPACE, methodName);
  64. // 添加一个请求参数
  65. soapObject.addProperty("theRegionCode", province);
  66. // 使用soap1.1协议创建envelop对象
  67. SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
  68. SoapEnvelope.VER11);
  69. envelope.bodyOut = soapObject;
  70. // 设置与.NET提供的webservice保持较好的兼容性
  71. envelope.dotNet = true;
  72. // 调用webservice
  73. try {
  74. ht.call(SERVICE_NAMESPACE + methodName, envelope);
  75. if (envelope.getResponse() != null) {
  76. // 获取服务器响应返回的SOAP消息
  77. SoapObject result = (SoapObject) envelope.bodyIn;
  78. SoapObject detail = (SoapObject) result.getProperty(methodName
  79. + "Result");
  80. // 解析服务器响应的SOAP消息
  81. return parseProvinceOrCity(detail);
  82. }
  83. } catch (SoapFault e) {
  84. // TODO Auto-generated catch block
  85. e.printStackTrace();
  86. } catch (IOException e) {
  87. // TODO Auto-generated catch block
  88. e.printStackTrace();
  89. } catch (XmlPullParserException e) {
  90. // TODO Auto-generated catch block
  91. e.printStackTrace();
  92. }
  93. return null;
  94. }
  95. // 解析省份或城市
  96. public static List<String> parseProvinceOrCity(SoapObject detail) {
  97. ArrayList<String> result = new ArrayList<String>();
  98. for (int i = 0; i < detail.getPropertyCount(); i++) {
  99. // 解析出每个省份
  100. result.add(detail.getProperty(i).toString().split(",")[0]);
  101. }
  102. return result;
  103. }
  104. // 根据城市字符串获取相应天气情况
  105. public static SoapObject getWeatherByCity(String cityName) {
  106. String methodName = "getWeather";
  107. HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
  108. ht.debug = true;
  109. SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
  110. SoapEnvelope.VER11);
  111. SoapObject soapObject = new SoapObject(SERVICE_NAMESPACE, methodName);
  112. soapObject.addProperty("theCityCode", cityName);
  113. envelope.bodyOut = soapObject;
  114. envelope.dotNet = true;
  115. try {
  116. ht.call(SERVICE_NAMESPACE + methodName, envelope);
  117. SoapObject result = (SoapObject) envelope.bodyIn;
  118. SoapObject detail = (SoapObject) result.getProperty(methodName
  119. + "Result");
  120. return detail;
  121. } catch (IOException e) {
  122. // TODO Auto-generated catch block
  123. e.printStackTrace();
  124. } catch (XmlPullParserException e) {
  125. // TODO Auto-generated catch block
  126. e.printStackTrace();
  127. }
  128. return null;
  129. }
  130. }
  131. </span>

上面这个便是主要实现远程调用webservice的代码,其他实现在activity中完成即可,但是这里也会涉及到一个问题,就是Android多线程问题,在调用webservice时,为了防止ANR的出现,不能在主线程中进行,需要另开子线程执行,,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的.便要涉及Handler的使用了,实在是不才,自己更多时候习惯使用AsyncTask来代替Handler(还是要重新琢磨下Handler的使用方法),因为操作起来比较简单方便,下面是项目中异步操作类中的一个:

[java] view plaincopy

  1. <span style="font-family:Comic Sans MS;font-size:18px;">package com.example.webservicedemo;
  2. import java.util.List;
  3. import android.os.AsyncTask;
  4. import android.widget.Spinner;
  5. public class ProvinceAsyncTask extends AsyncTask<String, String, List<String>> {
  6. private MainActivity activity;
  7. private List<String> provinces;
  8. private Spinner sp_province;
  9. public ProvinceAsyncTask (MainActivity activity,Spinner sp_province){
  10. this.activity = activity;
  11. this.sp_province = sp_province;
  12. }
  13. @Override
  14. protected List<String> doInBackground(String... params) {
  15. // TODO Auto-generated method stub
  16. provinces = WebServiceUtil.getProvinceList();
  17. return null;
  18. }
  19. @Override
  20. protected void onPostExecute(List<String> result) {
  21. // TODO Auto-generated method stub
  22. ListAdapter adapter = new ListAdapter(activity, provinces);
  23. sp_province.setAdapter(adapter);
  24. }
  25. }
  26. </span>

可以看出来比较简单,在doInBackground中执行调用webservice,在onPostExecute中执行列表刷新展示

最后附上该demo的代码,希望可以对初涉及android调用webservice的朋友有帮助

http://download.csdn.net/detail/eyu8874521/5609627

时间: 2024-12-10 23:28:09

Android使用ksoap2-android调用WebService学习的相关文章

C#程序员学习Android开发系列之调用WebService

我在学习Android开发过程中遇到的第一个疑问就是Android客户端是怎么跟服务器数据库进行交互的呢?这个问题是我当初初次接触Android时所困扰我的一个很大的问题,直到几年前的一天,我突然想到WebService是否可以呢?让WebService充当服务器端的角色,完成与服务器数据库操作相关的事情,而Android客户端只要按照WebService方法参数的要求去调用就行了.在当时我对这个解决方案的实现还没模糊,我想这个问题也是初学Android的朋友肯定会想到的问题.那么现在就让我们动

Android开发系列之调用WebService

我在学习Android开发过程中遇到的第一个疑问就是Android客户端是怎么跟服务器数据库进行交互的呢?这个问题是我当初初次接触Android时所困扰我的一个很大的问题,直到几年前的一天,我突然想到WebService是否可以呢?让WebService充当服务器端的角色,完成与服务器数据库操作相关的事情,而Android客户端只要按照WebService方法参数的要求去调用就行了.在当时我对这个解决方案的实现还没模糊,我想这个问题也是初学Android的朋友肯定会想到的问题.那么现在就让我们动

Android使用ksoap2-android调用WebService

现在的移动设备根本不可能离得开网络连接,数据的交换.最近学习的是在android端如何去调用远程WebService,都说WebService是一种基于SOAP协议的远程调用标准,对于这个协议理解不深,知道webservice可以将不同操作系统平台.不同语言.不同技术整合到一块,android SDK没有直接调用webservice的库,最常用的是借助ksoap2-android这个第三方SDK,点击打开链接,然后和其他第三方jar包一样导入android项目中即可. 1,定义webservic

Android通过ksoap2这个框架调用webservice大讲堂

昨天有人问我Android怎么连接mysql数据库,和对数据库的操作呀,我想把,给他说说json通信,可是他并不知道怎么弄,哎算了吧,直接叫他用ksoap吧,给他说了大半天,好多零碎的知识,看来还是有必要把这些东西整合起来,一方面自己有时候也看,另一方面当然是能帮助没有做个的小伙伴,其实东西不是很多,就是讲的有点详细,不怕多,就怕不仔细, WebServices简介 Web services是一种部署在Web上的对象或者组件,能够通过Internet进行调用的应用程序.Web services

在Android中使用Android Ksoap2调用WebService

一.WebService介绍 WebService是基于SOAP协议可实现web服务器与web服务器之间的通信,因采用SOAP协议传送XML数据具有平台无关性,也是成为解决异构平台之间通信的重要解决方案,比如Java平台与.net平台之间.因此在web应用中有着举足轻重的作用,很多机构.组织都在各自平台上对外发布了WebService(例如:天气预报.航班信息.股市行情等等),这样任何平台和客户都可以享受到这些服务,当然有些是要付费的. 二.Android ksoap2组件 对于Android端

Android使用KSOAP2调用WebService及正确导入jar包的问题(转)

Android使用KSOAP2调用WebService及正确导入jar包的问题(转)     错误信息 最近在学Android使用KSOAP2调用现有的Webservice的方法,期间在网上找了很多代码,但是每次在Android模拟器中运行的时候程序都会崩溃,搞得自己都快崩溃了.... 查看了一下LogCat中的错误报告,发现是因为java.lang.NoClassDefFoundError导致程序崩溃的: view plainprint? ERROR/AndroidRuntime(600): 

Android调用WebService系列之KSoap2对象解析

在在网络APP中有2个非常重要的节 客户端请求服务端接口的能力 客户端,服务端的对接 而我的Android调用WebService系列共四篇这是最后一篇,所要讲述的只仅仅是Android调用WebService这一种比较少用且不推荐用,但是在一些特定的场合下不得不用的调用方式. Android调用WebService系列之封装能力,Android调用WebService系列之请求调用是讲的请求服务端的能力主要是介绍APP如何拥有,或者说更好的更方便的拥有这种能力 而Android调用WebSer

android之调用webservice 实现图片上传

转:http://www.cnblogs.com/top5/archive/2012/02/16/2354517.html public void testUpload(){ try{ String srcUrl = "/sdcard/"; //路径 String fileName = "aa.jpg"; //文件名 FileInputStream fis = new FileInputStream(srcUrl + fileName); ByteArrayOutp

Android调用WebService

这两天给老师做地铁app的demo,与后台的交互要用WebService,还挺麻烦的.所以想写点,希望有用. Web Services(Web服务)是一个用于支持网络间不同机器互操作的软件系统,它是一种自包含.自描述和模块化的应用程序,它可以在网络中被描述.发布和调用,可以将它看作是基于网络的.分布式的模块化组件.它建立在HTTP,SOAP,WSDL这些通信协议之上,可以轻松的跨平台. 我们用的WebService就是服务器公布的一个接口,连上之后可以交互.WSDL是一份XML文档,它描述了We