Android调用天气预报的WebService简单例子

本文介绍如何使用KSOAP2库在Android应用中调用WebService。详细步骤包括配置环境、生成SOAP请求、发送请求及解析返回结果,并附带示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、获取并使用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-android/source/browse/m2-repo/com/google/code/ksoap2-android/ksoap2-android-assembly/2.5.4/ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar点 View raw file 才正确下载对应文件的。

201104260922265626.png
4天前 上传
下载附件 (1.85 KB)

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

201104260922326394.png

4天前 上传
下载附件 (92.45 KB)

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


201104260922387926.png
4天前 上传
下载附件 (93.39 KB)


二,分以下几步来调用 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方法获得返回数据。

private SoapObject detail;detail =(SoapObject) envelope.getResponse();

2、使用 bodyIn 及 getProperty。

private SoapObject detail;SoapObject result = (SoapObject)envelope.bodyIn;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>
复制代码
完整的代码如下:
  1. package ghj1976.MyWeather;

  2. import java.io.UnsupportedEncodingException;

  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.Toast;

  8. import org.ksoap2.SoapEnvelope;
  9. import org.ksoap2.serialization.SoapObject;
  10. import org.ksoap2.serialization.SoapSerializationEnvelope;
  11. //import org.ksoap2.transport.AndroidHttpTransport;
  12. import org.ksoap2.transport.HttpTransportSE;

  13. public class MyWeatherActivity extends Activity {

  14. private Button okButton;

  15. /** Called when the activity is first created. */
  16. @Override
  17. public void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.main);

  20. okButton = (Button) this.findViewById(R.id.btn_Search);
  21. okButton.setOnClickListener(new Button.OnClickListener() {
  22. @Override
  23. public void onClick(View v) {
  24. String city = "北京";
  25. getWeather(city);
  26. }

  27. });
  28. }

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

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

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

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

  34. private String weatherToday;

  35. private SoapObject detail;

  36. public void getWeather(String cityName) {
  37. try {
  38. System.out.println("rpc------");
  39. SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);
  40. System.out.println("rpc" + rpc);
  41. System.out.println("cityName is " + cityName);
  42. rpc.addProperty("theCityName", cityName);


  43. SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
  44. envelope.bodyOut = rpc;
  45. envelope.dotNet = true;
  46. envelope.setOutputSoapObject(rpc);

  47. HttpTransportSE ht = new HttpTransportSE(URL);

  48. //AndroidHttpTransport ht = new AndroidHttpTransport(URL);
  49. ht.debug = true;

  50. ht.call(SOAP_ACTION, envelope);
  51. //ht.call(null, envelope);

  52. //SoapObject result = (SoapObject)envelope.bodyIn;
  53. //detail = (SoapObject) result.getProperty("getWeatherbyCityNameResult");

  54. detail =(SoapObject) envelope.getResponse();

  55. //System.out.println("result" + result);
  56. System.out.println("detail" + detail);
  57. Toast.makeText(this, detail.toString(), Toast.LENGTH_LONG).show();
  58. parseWeather(detail);

  59. return;
  60. } catch (Exception e) {
  61. e.printStackTrace();
  62. }
  63. }

  64. private void parseWeather(SoapObject detail)
  65. throws UnsupportedEncodingException {
  66. String date = detail.getProperty(6).toString();
  67. weatherToday = "今天:" + date.split(" ")[0];
  68. weatherToday = weatherToday + "\n天气:" + date.split(" ")[1];
  69. weatherToday = weatherToday + "\n气温:"
  70. + detail.getProperty(5).toString();
  71. weatherToday = weatherToday + "\n风力:"
  72. + detail.getProperty(7).toString() + "\n";
  73. System.out.println("weatherToday is " + weatherToday);
  74. Toast.makeText(this, weatherToday, Toast.LENGTH_LONG).show();

  75. }
  76. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值