博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android调用天气预报的WebService简单例子
阅读量:4288 次
发布时间:2019-05-27

本文共 5937 字,大约阅读时间需要 19 分钟。

下面例子改自网上例子:

不过网上这个例子有些没有说明,有些情况不一样了,所以我重新写了。

一、获取并使用KSOAP包

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

KSOAP2 地址:

我下载的最新的是: 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文件是错误的导致的,走了弯路。

在  页面 通过鼠标右键链接另存为存的是同名的一个纯文本的Html文件。而不是我们想要的。

我是在 

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

完整的代码如下:

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接口 

Android调用WebService 

中国气象局的WebService地址 

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

转载地址:http://votgi.baihongyu.com/

你可能感兴趣的文章
PHP入门概述
查看>>
PHP配置和基础知识
查看>>
PHP配置加强二
查看>>
PHP 基础一
查看>>
iOS 输出指定位数
查看>>
iOS 中的传值的方法
查看>>
PHP 基础二
查看>>
iOS IPV6域名转IP
查看>>
iOS 解决苹果手机锁屏后APP退出的问题及app状态
查看>>
PHP基础三
查看>>
iOS7以后解决view上移的问题
查看>>
iOS后台运行延长时间
查看>>
PHP基础 四
查看>>
iOS中导航栏navigationBar返回按钮--导航右侧按钮--常用设置、导航控制器全局设置返回按钮
查看>>
iOS中判断是否首次下载app
查看>>
iOS 沙盒机制,沙盒存储,钥匙串
查看>>
iOS设备唯一标识保存、钥匙串
查看>>
iOS判断网络
查看>>
iOS需要学习和解决的若干问题-----------------
查看>>
iOS 十进制转换成十六进制
查看>>