android ksoap调用天气预报

WebService 是一种基于SOAP协议的远程调用标准。通过WebService可以将不同操作系统平台,不同语言、不同技术整合到一起。在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方类库(KSOAP2)来调用WebService。在本文将介绍在Android 中调用WebService的具体细节,并在最后给出一个完整的例子来演示如何使用KSOAP2来调用WebService。


安装第三方类库:KSOAP2
        PC版本的WebService客户端类库非常丰富,例如,Axis2、CXF等,但这些类库对于Android系统过于庞大,也未必很容易移植到 Android系统上。因此,这些开发包并不在我们考虑的范围内。适合手机的WebService客户端类库也有一些。本例使用了比较常用的 KSOAP2。读者可以从如下的地址下载Android版的KSOAP2。
 http://code.google.com/p/ksoap2-android/downloads/list?can=1&q=&colspec=Filename+Summary+Uploaded+Size+DownloadCount



二,分以下几步来调用 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> 
完整的代码如下: 

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值