[转帖]Android调用天气预报的WebService简单例子_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3655 | 回复: 0   主题: [转帖]Android调用天气预报的WebService简单例子        下一篇 
huizai
注册用户
等级:少校
经验:933
发帖:83
精华:0
注册:2013-6-18
状态:离线
发送短消息息给huizai 加好友    发送短消息息给huizai 发消息
发表于: IP:您无权察看 2013-6-19 16:07:28 | [全部帖] [楼主帖] 楼主

转自:http://blog.csdn.net/gaoguoxin2/article/details/7674701

一、获取并使用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 才正确下载对应文件的。

北京联动北方科技有限公司

选择我们的项目,右键菜单中 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方法获得返回数据。

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()的输出了!!

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ghj1976.MyWeather" android:versionCode="1"
android:versionName="1.0">

<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MyWeatherActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

</manifest>

;

完整的代码如下:

package ghj1976.MyWeather;

import java.io.UnsupportedEncodingException;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
//import org.ksoap2.transport.AndroidHttpTransport;
import org.ksoap2.transport.HttpTransportSE;

public class MyWeatherActivity extends Activity {

       private Button okButton;

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

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

             });
       }

       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 SoapObject detail;

       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);

                  
                   SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                   envelope.bodyOut = rpc;
                   envelope.dotNet = true;
                   envelope.setOutputSoapObject(rpc);

                   HttpTransportSE ht = new HttpTransportSE(URL);

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

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

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

                   detail =(SoapObject) envelope.getResponse();

                   //System.out.println("result" + result);
                   System.out.println("detail" + detail);
                   Toast.makeText(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 + "\n天气:" + date.split(" ")[1];
       weatherToday = weatherToday + "\n气温:"
       + detail.getProperty(5).toString();
       weatherToday = weatherToday + "\n风力:"
       + detail.getProperty(7).toString() + "\n";
       System.out.println("weatherToday is " + weatherToday);
       Toast.makeText(this, weatherToday, Toast.LENGTH_LONG).show();

}
}

;

参考资料

在Android中访问WebService接口

http://www.cnblogs.com/yy-7years/archive/2011/01/24/1943286.html


Android调用WebService

http://express.ruanko.com/ruanko-express_34/technologyexchange5.html


中国气象局的WebService地址

http://www.webxml.com.cn/WebServices/WeatherWebService.asmx


Android与服务器端数据交互(基于SOAP协议整合android+webservice)

http://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论