设为首页收藏本站

Scripts 学盟

 找回密码
 加入学盟

QQ登录

只需一步,快速开始

查看: 2522|回复: 3
打印 上一主题 下一主题

Android调用WebService简单例子 [复制链接]

Rank: 8Rank: 8

跳转到指定楼层
1#
那个谁 发表于 2011-10-11 14:01:51 |只看该作者 |正序浏览
一、获取并使用KSOAP包

在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService。PC版本的WebService库非常丰富,但这些对Android来说过于庞大。适合手机的WebService客户端的SDK有一些,比较常用的是KSOAP2。

KSOAP2 地址:http://code.google.com/p/ksoap2-android/

我下载的最新的是: ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar

注意:

我在使用ksoap2-android时犯了一个低级错误:使用时报错误:The import org.ksoap2 cannot be resolved。
当时分析这个问题时一直以为是Eclipse出了问题,找了好多方法都不行,
实际是我下载的ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar文件是错误的导致的,走了弯路。

http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2 页面 通过鼠标右键链接另存为存的是同名的一个纯文本的Html文件。而不是我们想要的。

我是在
http://code.google.com/p/ksoap2- ... th-dependencies.jar  点 View raw file 才正确下载对应文件的。





选择我们的项目,右键菜单中 Build Path –> Add External Archives… 增加这个下载的包



增加好后,我们在 选择我们的项目,右键菜单中 Build Path –> Configure Build Path 的 Libraries 中可以看到下面图:



二,分以下几步来调用 WebService



1、指定 WebService 的命名空间和调用方法

import org.ksoap2.serialization.SoapObject;
private static final String NAMESPACE = "http://WebXml.com.cn/";
private static final String METHOD_NAME = "getWeatherbyCityName";

SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);SoapObject类的第一个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。
第二个参数表示要调用的WebService方法名。

2、设置调用方法的参数值,如果没有参数,可以省略,设置方法的参数值的代码如下:

rpc.addProperty("theCityName", "北京");要注意的是,addProperty方法的第1个参数虽然表示调用方法的参数名,但该参数值并不一定与服务端的WebService类中的方法参数名一致,只要设置参数的顺序一致即可。

3、生成调用Webservice方法的SOAP请求信息。

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = rpc;
envelope.dotNet = true;
envelope.setOutputSoapObject(rpc);创建SoapSerializationEnvelope对象时需要通过SoapSerializationEnvelope类的构造方法设置SOAP协议的版本号。
该版本号需要根据服务端WebService的版本号设置。
在创建SoapSerializationEnvelope对象后,不要忘了设置SOAPSoapSerializationEnvelope类的bodyOut属性,
该属性的值就是在第一步创建的SoapObject对象。

4、创建HttpTransportsSE对象。

这里不要使用 AndroidHttpTransport ht = new AndroidHttpTransport(URL); 这是一个要过期的类

private static String URL = "http://www.webxml.com.cn/webservices/weatherwebservice.asmx";
HttpTransportSE ht = new HttpTransportSE(URL); ht.debug = true;5、使用call方法调用WebService方法

private static String SOAP_ACTION = "http://WebXml.com.cn/getWeatherbyCityName";
ht.call(SOAP_ACTION, envelope);网上有人说这里的call的第一个参数为null,但是经过我的测试,null是不行的。
第2个参数就是在第3步创建的SoapSerializationEnvelope对象。

6、获得WebService方法的返回结果

有两种方法:

1、使用getResponse方法获得返回数据。
  1. private SoapObject detail;
  2. detail =(SoapObject) envelope.getResponse();2、使用 bodyIn 及 getProperty。

  3. private SoapObject detail;
  4. SoapObject result = (SoapObject)envelope.bodyIn;
  5. detail = (SoapObject) result.getProperty("getWeatherbyCityNameResult");7、 这时候执行会出错,提示没有权限访问网络
复制代码
需要修改 AndroidManifest.xml 文件,赋予相应权限

简单来说就是增加下面这行配置:<uses-permission android:name="android.permission.INTERNET"></uses-permission>

完整的 AndroidManifest.xml 文件 如下:



注:Android 中在代码中为了调试写了system.out.print()输出项

在菜单:Window-->show view-->other-->找到Android,选择Logcat 是可以看到输出的,
如果你想在一个单独的窗口看到system.out.print()的输出的话,可以在logcat界面点那个绿色的“+”好,

在Filter name 和 By log tag里面均填入System.out,这样的话你就能在单独的界面查看system.out.print()的输出了!!
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.         package="ghj1976.MyWeather" android:versionCode="1"
  4.         android:versionName="1.0">

  5.         <application android:icon="@drawable/icon" android:label="@string/app_name">
  6.                 <activity android:name=".MyWeatherActivity" android:label="@string/app_name">
  7.                         <intent-filter>
  8.                                 <action android:name="android.intent.action.MAIN" />
  9.                                 <category android:name="android.intent.category.LAUNCHER" />
  10.                         </intent-filter>
  11.                 </activity>
  12.         </application>
  13.         <uses-permission android:name="android.permission.INTERNET"></uses-permission>

  14. </manifest>完整的代码如下:

  15. package ghj1976.MyWeather;

  16. import java.io.UnsupportedEncodingException;

  17. import android.app.Activity;
  18. import android.os.Bundle;
  19. import android.view.View;
  20. import android.widget.Button;
  21. import android.widget.Toast;

  22. import org.ksoap2.SoapEnvelope;
  23. import org.ksoap2.serialization.SoapObject;
  24. import org.ksoap2.serialization.SoapSerializationEnvelope;
  25. //import org.ksoap2.transport.AndroidHttpTransport;
  26. import org.ksoap2.transport.HttpTransportSE;

  27. public class MyWeatherActivity extends Activity {

  28.         private Button okButton;

  29.         /** Called when the activity is first created. */
  30.         @Override
  31.         public void onCreate(Bundle savedInstanceState) {
  32.                 super.onCreate(savedInstanceState);
  33.                 setContentView(R.layout.main);
  34.                
  35.                 okButton = (Button) this.findViewById(R.id.btn_Search);
  36.                 okButton.setOnClickListener(new Button.OnClickListener() {
  37.                         @Override
  38.                         public void onClick(View v) {
  39.                                   String city = "北京";
  40.                                   getWeather(city);  
  41.                         }

  42.                 });
  43.         }

  44.         private static final String NAMESPACE = "http://WebXml.com.cn/";

  45.         // WebService地址
  46.         private static String URL = "http://www.webxml.com.cn/webservices/weatherwebservice.asmx";

  47.         private static final String METHOD_NAME = "getWeatherbyCityName";

  48.         private static String SOAP_ACTION = "http://WebXml.com.cn/getWeatherbyCityName";

  49.         private String weatherToday;

  50.         private SoapObject detail;

  51.         public void getWeather(String cityName) {
  52.                 try {
  53.                         System.out.println("rpc------");
  54.                         SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);
  55.                         System.out.println("rpc" + rpc);
  56.                         System.out.println("cityName is " + cityName);
  57.                         rpc.addProperty("theCityName", cityName);

  58.                        
  59.                         SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
  60.                         envelope.bodyOut = rpc;
  61.                         envelope.dotNet = true;
  62.                         envelope.setOutputSoapObject(rpc);
  63.                        
  64.                         HttpTransportSE ht = new HttpTransportSE(URL);

  65.                         //AndroidHttpTransport ht = new AndroidHttpTransport(URL);
  66.                         ht.debug = true;

  67.                         ht.call(SOAP_ACTION, envelope);
  68.                         //ht.call(null, envelope);

  69.                         //SoapObject result = (SoapObject)envelope.bodyIn;
  70.                         //detail = (SoapObject) result.getProperty("getWeatherbyCityNameResult");

  71.                         detail =(SoapObject) envelope.getResponse();
  72.                        
  73.                         //System.out.println("result" + result);
  74.                         System.out.println("detail" + detail);
  75.                         Toast.makeText(this, detail.toString(), Toast.LENGTH_LONG).show();
  76.                         parseWeather(detail);

  77.                         return;
  78.                 } catch (Exception e) {
  79.                         e.printStackTrace();
  80.                 }
  81.         }

  82.         private void parseWeather(SoapObject detail)
  83.                         throws UnsupportedEncodingException {
  84.                 String date = detail.getProperty(6).toString();
  85.                 weatherToday = "今天:" + date.split(" ")[0];
  86.                 weatherToday = weatherToday + "\n天气:" + date.split(" ")[1];
  87.                 weatherToday = weatherToday + "\n气温:"
  88.                                 + detail.getProperty(5).toString();
  89.                 weatherToday = weatherToday + "\n风力:"
  90.                                 + detail.getProperty(7).toString() + "\n";
  91.                 System.out.println("weatherToday is " + weatherToday);
  92.                 Toast.makeText(this, weatherToday, Toast.LENGTH_LONG).show();

  93.         }
  94. }
复制代码
参考资料

在Android中访问WebService接口
http://www.cnblogs.com/yy-7years/archive/2011/01/24/1943286.html

Android调用WebService
http://express.ruanko.com/ruanko ... ologyexchange5.html

中国气象局的WebService地址
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx

Android与服务器端数据交互(基于SOAP协议整合android+webservice)
http://www.cnblogs.com/zhangdong ... /04/19/2020688.html

1

查看全部评分

分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享分享0 收藏收藏0

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

4#
混混@普宁.中国 实名认证  发表于 2011-10-12 09:11:34 |只看该作者
杰管来录制

使用道具 举报

Rank: 8Rank: 8

3#
那个谁 发表于 2011-10-12 08:41:30 |只看该作者
混混@普宁.中国 发表于 2011-10-11 21:04
杰管发视频教程

求视频教程。。。。

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

2#
混混@普宁.中国 实名认证  发表于 2011-10-11 21:04:13 |只看该作者
杰管发视频教程

使用道具 举报

您需要登录后才可以回帖 登录 | 加入学盟

手机版|Scripts 学盟   |

GMT+8, 2024-12-24 08:31 , Processed in 1.109608 second(s), 12 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部