Google为Android平台开发Web Service客户端提供了ksoap2-android项目,在这个网址下载开发包http://code.google.com/p/ksoap2-android/source/browse/m2-repo/com/google/code/ksoap2-android/ksoap2-android-assembly/3.1.0/ksoap2-android-assembly-3.1.0-jar-with-dependencies.jar
使用 kspoap2-android调用webserice操作的步骤如下:
1、创建HttpTransportSE传输对象 传入webservice服务器地址
- final HttpTransportSE httpSE = new HttpTransportSE(SERVER_URL);
2、 创建SoapObject对象,创建该对象时需要传入所要调用Wb Service的命名空间、Web Service方法名;如果有参数要传给Web Service服务器,调用SoapObject对象的addProperty(String name,Object value)方法来设置参数,该方法的name参数指定参数名;value参数指定参数值
- SoapObject soapObject = new SoapObject(PACE, M_NAME);
- soapObject.addProperty("byProvinceName ", citys);
3、创建SoapSerializationEnelope对象,并传入SOAP协议的版本号;并设置对象的bodyOut属性
- final SoapSerializationEnvelope soapserial = new SoapSerializationEnvelope(
- SoapEnvelope.VER11);
- soapserial.bodyOut = soapObject;
- // 设置与.NET提供的Web service保持有良好的兼容性
- soapserial.dotNet = true;
6、调用HttpTransportSE对象的call()方法,其中call的第一个参数soapAction,第二个为SoapSerializationEvelope对象 调用远程Web Service;
- // 调用HttpTransportSE对象的call方法来调用 webserice
- httpSE.call(PACE + M_NAME, soapserial);
7、获取返回的信息,并解析
- // 获取服务器响应返回的SOAP消息
- SoapObject result = (SoapObject) soapserial.bodyIn;
- SoapObject detail = (SoapObject) result.getProperty("getSupportProvinceResult");
- //解析返回信息
- for (int i = 0; i < detail.getPropertyCount(); i++) {
- citys.add(detail.getProperty(i).toString());
- }
实例:通过天气预报 Web 服务 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
MainActivity.java
- package com.example.webserviceteset;
- import java.util.List;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.ImageView;
- import android.widget.TextView;
- import android.widget.AdapterView.OnItemSelectedListener;
- import android.widget.ArrayAdapter;
- import android.widget.Spinner;
- public class MainActivity extends Activity {
- private Spinner city, citys;
- private List<String> listcity, listcitys, weater;
- // 分别显示近三天的天气信息和城市介绍
- private TextView cityNames1, cityNames2, cityNames3, cityjie;
- private ImageView weateImage1, weateImage2, weateImage3;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- citys = (Spinner) findViewById(R.id.citys);
- city = (Spinner) findViewById(R.id.city);
- cityNames1 = (TextView) findViewById(R.id.cityNames1);
- cityNames2 = (TextView) findViewById(R.id.cityNames2);
- cityNames3 = (TextView) findViewById(R.id.cityNames3);
- cityjie = (TextView) findViewById(R.id.cityjie);
- weateImage1 = (ImageView) findViewById(R.id.weateImage1);
- weateImage2 = (ImageView) findViewById(R.id.weateImage2);
- weateImage3 = (ImageView) findViewById(R.id.weateImage3);
- // cityNames1=(TextView)findViewById(R.i)
- listcitys = WebServiceTest.getCitys();
- ArrayAdapter<String> citysAdater = new ArrayAdapter<String>(this,
- android.R.layout.simple_list_item_multiple_choice, listcitys);
- citys.setAdapter(citysAdater);
- listcity = WebServiceTest.getCity(citys.getSelectedItem().toString());
- ArrayAdapter<String> cityAdater = new ArrayAdapter<String>(this,
- android.R.layout.simple_list_item_multiple_choice, listcity);
- city.setAdapter(cityAdater);
- citys.setOnItemSelectedListener(new OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> arg0, View arg1,
- int arg2, long arg3) {
- listcity = WebServiceTest.getCity(citys.getSelectedItem()
- .toString());
- ArrayAdapter<String> cityAdater1 = new ArrayAdapter<String>(
- MainActivity.this,
- android.R.layout.simple_list_item_multiple_choice,
- listcity);
- city.setAdapter(cityAdater1);
- }
- @Override
- public void onNothingSelected(AdapterView<?> arg0) {
- // TODO Auto-generated method stub
- }
- });
- city.setOnItemSelectedListener(new OnItemSelectedListener() {
- // 返回数据: 一个一维数组 String(22),共有23个元素。
- @Override
- public void onItemSelected(AdapterView<?> arg0, View arg1,
- int arg2, long arg3) {
- weater = WebServiceTest.getWeather(city.getSelectedItem()
- .toString());
- for (int i = 0; i < weater.size(); i++) {
- System.out.println("i=" + i + ":" + weater.get(i));
- }
- cityNames1.setText(weater.get(6) + " " + weater.get(5) + " "
- + weater.get(7));
- cityNames1.setBackgroundResource(ChangeImageView.imageId(weater
- .get(8)));
- weateImage1.setImageResource(ChangeImageView.imageId(weater
- .get(8)));
- cityNames2.setText(weater.get(13) + " " + weater.get(12) + " "
- + weater.get(14));
- cityNames2.setBackgroundResource(ChangeImageView.imageId(weater
- .get(15)));
- weateImage2.setImageResource(ChangeImageView.imageId(weater
- .get(15)));
- cityNames3.setText(weater.get(18) + " " + weater.get(17) + " "
- + weater.get(19));
- cityNames3.setBackgroundResource(ChangeImageView.imageId(weater
- .get(20)));
- weateImage3.setImageResource(ChangeImageView.imageId(weater
- .get(21)));
- cityjie.setText(weater.get(22));
- }
- @Override
- public void onNothingSelected(AdapterView<?> arg0) {
- // TODO Auto-generated method stub
- }
- });
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- }
WebServiceTest.java
- package com.example.webserviceteset;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.Callable;
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.FutureTask;
- import org.ksoap2.SoapEnvelope;
- import org.ksoap2.serialization.SoapObject;
- import org.ksoap2.serialization.SoapSerializationEnvelope;
- import org.ksoap2.transport.HttpTransportSE;
- public class WebServiceTest {
- // Webservice服务器地址
- private static final String SERVER_URL = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx";
- // 调用的webservice命令空间
- private static final String PACE = "http://WebXml.com.cn/";
- // 获取所有省份的方法名
- private static final String M_NAME = "getSupportProvince";
- // 获取省份包含的城市的方法名
- private static final String MC_NAME = "getSupportCity";
- // 获取天气详情的方法名
- private static final String W_NAME = "getWeatherbyCityName";
- /**
- *
- * @return 所有省份
- */
- public static List<String> getCitys() {
- // 创建HttpTransportSE传说对象 传入webservice服务器地址
- final HttpTransportSE httpSE = new HttpTransportSE(SERVER_URL);
- httpSE.debug = true;
- // 创建soapObject对象并传入命名空间和方法名
- SoapObject soapObject = new SoapObject(PACE, M_NAME);
- // 创建SoapSerializationEnvelope对象并传入SOAP协议的版本号
- final SoapSerializationEnvelope soapserial = new SoapSerializationEnvelope(
- SoapEnvelope.VER11);
- soapserial.bodyOut = soapObject;
- // 设置与.NET提供的Web service保持有良好的兼容性
- soapserial.dotNet = true;
- // 使用Callable与Future来创建启动线程
- FutureTask<List<String>> future = new FutureTask<List<String>>(
- new Callable<List<String>>() {
- @Override
- public List<String> call() throws Exception {
- List<String> citys = new ArrayList<String>();
- // 调用HttpTransportSE对象的call方法来调用 webserice
- httpSE.call(PACE + M_NAME, soapserial);
- if (soapserial.getResponse() != null) {
- // 获取服务器响应返回的SOAP消息
- SoapObject result = (SoapObject) soapserial.bodyIn;
- SoapObject detail = (SoapObject) result
- .getProperty("getSupportProvinceResult");
- // 解析返回信息
- for (int i = 0; i < detail.getPropertyCount(); i++) {
- citys.add(detail.getProperty(i).toString());
- }
- return citys;
- }
- return null;
- }
- });
- new Thread(future).start();
- try {
- return future.get();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ExecutionException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
- }
- /**
- *
- * @param citys
- * 省份
- * @return 该省下的所有城市
- */
- public static List<String> getCity(String citys) {
- // 创建HttpTransportSE对象
- final HttpTransportSE httpSE = new HttpTransportSE(SERVER_URL);
- httpSE.debug = true;
- // 创建SoapObject对象
- SoapObject soapObject = new SoapObject(PACE, MC_NAME);
- // 添加参数
- soapObject.addProperty("byProvinceName ", citys);
- // 创建SoapSerializationEnvelope
- final SoapSerializationEnvelope serializa = new SoapSerializationEnvelope(
- SoapEnvelope.VER11);
- serializa.bodyOut = soapObject;
- serializa.dotNet = true;
- FutureTask<List<String>> future = new FutureTask<List<String>>(
- new Callable<List<String>>() {
- @Override
- public List<String> call() throws Exception {
- List<String> city = new ArrayList<String>();
- // 调用Web Service
- httpSE.call(PACE + MC_NAME, serializa);
- // 获取返回信息
- if (serializa.getResponse() != null) {
- SoapObject restul = (SoapObject) serializa.bodyIn;
- SoapObject detial = (SoapObject) restul
- .getProperty("getSupportCityResult");
- // 解析返回信息
- for (int i = 0; i < detial.getPropertyCount(); i++) {
- // 获取城市名
- String str = detial.getPropertyAsString(i)
- .toString();
- String strCity = str.substring(0,
- str.indexOf("(") - 1);
- city.add(strCity);
- }
- return city;
- }
- return null;
- }
- });
- new Thread(future).start();
- try {
- return future.get();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ExecutionException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
- }
- // 获取三天之内的天气详情
- public static List<String> getWeather(String citys) {
- final HttpTransportSE httpSe = new HttpTransportSE(SERVER_URL);
- httpSe.debug = true;
- SoapObject soapObject = new SoapObject(PACE, W_NAME);
- soapObject.addProperty("theCityName", citys);
- final SoapSerializationEnvelope serializa = new SoapSerializationEnvelope(
- SoapEnvelope.VER11);
- serializa.bodyOut = soapObject;
- serializa.dotNet = true;
- FutureTask<List<String>> future = new FutureTask<List<String>>(
- new Callable<List<String>>() {
- @Override
- public List<String> call() throws Exception {
- List<String> list = new ArrayList<String>();
- // 调用webservice
- httpSe.call(PACE+W_NAME, serializa);
- // 获取返回信息
- if (serializa.getResponse() != null) {
- SoapObject result = (SoapObject) serializa.bodyIn;
- SoapObject deialt = (SoapObject) result
- .getProperty("getWeatherbyCityNameResult");
- // 解析数据
- for (int i = 0; i < deialt.getPropertyCount(); i++) {
- list.add(deialt.getProperty(i).toString());
- }
- }
- return list;
- }
- });
- new Thread(future).start();
- try {
- return future.get();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ExecutionException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
- }
- }
ChangeImageView.java
- package com.example.webserviceteset;
- public class ChangeImageView {
- // 由于下载下来的图片分 大中小 三种 而调用远程webserivce获取的值是小的图片名 所以的 根据获取的图片名称来获取向对应的大图片ID
- public static int imageId(String ids) {
- int id = R.drawable.a_0;
- int ided =Integer.parseInt(ids.substring(0, ids.indexOf(".")));
- switch (ided) {
- case 1:
- id = R.drawable.a_1;
- break;
- case 2:
- id = R.drawable.a_2;
- break;
- case 3:
- id = R.drawable.a_3;
- break;
- case 4:
- id = R.drawable.a_4;
- break;
- case 5:
- id = R.drawable.a_5;
- break;
- case 6:
- id = R.drawable.a_6;
- break;
- case 7:
- id = R.drawable.a_7;
- break;
- case 8:
- id = R.drawable.a_8;
- break;
- case 9:
- id = R.drawable.a_9;
- break;
- case 10:
- id = R.drawable.a_10;
- break;
- case 11:
- id = R.drawable.a_11;
- break;
- case 12:
- id = R.drawable.a_12;
- break;
- case 13:
- id = R.drawable.a_13;
- break;
- case 14:
- id = R.drawable.a_1;
- break;
- case 15:
- id = R.drawable.a_15;
- break;
- case 16:
- id = R.drawable.a_16;
- break;
- case 17:
- id = R.drawable.a_17;
- break;
- case 18:
- id = R.drawable.a_18;
- break;
- case 19:
- id = R.drawable.a_19;
- break;
- case 20:
- id = R.drawable.a_20;
- break;
- case 21:
- id = R.drawable.a_21;
- break;
- case 22:
- id = R.drawable.a_22;
- break;
- case 23:
- id = R.drawable.a_23;
- break;
- case 24:
- id = R.drawable.a_24;
- break;
- case 25:
- id = R.drawable.a_25;
- break;
- case 26:
- id = R.drawable.a_26;
- break;
- case 27:
- id = R.drawable.a_27;
- break;
- case 28:
- id = R.drawable.a_28;
- break;
- case 29:
- id = R.drawable.a_29;
- break;
- case 30:
- id = R.drawable.a_30;
- break;
- }
- return id;
- }
- }
activity_main.xml
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- tools:context=".MainActivity" >
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
- <Spinner
- android:id="@+id/citys"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- <Spinner
- android:id="@+id/city"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
- <TextView
- android:id="@+id/cityNames1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <ImageView
- android:id="@+id/weateImage1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
- <TextView
- android:id="@+id/cityNames2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <ImageView
- android:id="@+id/weateImage2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
- <TextView
- android:id="@+id/cityNames3"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <ImageView
- android:id="@+id/weateImage3"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
- <TextView
- android:id="@+id/cityjie"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:lines="6" />
- </LinearLayout>
- </LinearLayout>
- AndroidManifest.xmlAndroidManifest.xml
AndroidManifest.xml
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.webserviceteset"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk
- android:minSdkVersion="11"
- android:targetSdkVersion="17" />
- <uses-permission
- android:name="android.permission.INTERNET"/>
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="com.example.webserviceteset.MainActivity"
- 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>
- </manifest>