Android WebService(基于SOAP协议)

package com.nenglong.wsclient;  
  
import java.io.IOException;  
  
import org.ksoap2.SoapEnvelope;  
import org.ksoap2.serialization.SoapObject;  
import org.ksoap2.serialization.SoapSerializationEnvelope;  
import org.ksoap2.transport.HttpTransportSE;  
import org.xmlpull.v1.XmlPullParserException;  
  
import android.os.Bundle;  
import android.os.Handler;  
import android.os.Looper;  
import android.os.Message;  
import android.os.StrictMode;  
import android.app.Activity;  
import android.view.Menu;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.EditText;  
import android.widget.TextView;  
  
/** 
 * @author huanglong Android 平台调用WebService(手机号码归属地查询) 
 */  
public class MainActivity extends Activity {  
private TextView tv_result;  
private EditText et_phone;  
private Button btn_query;  
  
@Override  
public void onCreate(Bundle savedInstanceState) {  
super.onCreate(savedInstanceState);  
setContentView(R.layout.activity_main);  
initView();  
}  
  
private void initView() {  
tv_result = (TextView) findViewById(R.id.result_text);  
et_phone = (EditText) findViewById(R.id.et);  
btn_query = (Button) findViewById(R.id.btn_query);  
btn_query.setOnClickListener(new OnClickListener() {  
  
@Override  
public void onClick(View v) {  
// TODO Auto-generated method stub  
String phone = et_phone.getText().toString().trim();  
if ("".equals(phone) || phone.length() < 7) {  
et_phone.setText("您输入的手机号码有误");  
et_phone.requestFocus();  
tv_result.setText("");  
return;  
}  
getRemoteInfo(phone);  
}  
});  
}  
  
/** 
 * 查询号码段归属地的方法 
 *  
 * @param phone 
 *手机号码段 
 */  
public void getRemoteInfo(final String phone) {  
new Thread(new Runnable() {  
  
@Override  
public void run() {  
// TODO Auto-generated method stub  
// 命名空间  
String nameSpace = "http://WebXml.com.cn/";  
// 调用方法的名称  
String methodName = "getMobileCodeInfo";  
// EndPoint  
String endPoint = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";  
// SOAP Action  
String soapAction = "http://WebXml.com.cn/getMobileCodeInfo";  
// 指定WebService的命名空间和调用方法  
SoapObject soapObject = new SoapObject(nameSpace, methodName);  
// 设置需要调用WebService接口的两个参数mobileCode UserId  
soapObject.addProperty("mobileCode", phone);  
soapObject.addProperty("userId", "");  
// 生成调用WebService方法调用的soap信息,并且指定Soap版本  
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(  
SoapEnvelope.VER10);  
envelope.bodyOut = soapObject;  
// 是否调用DotNet开发的WebService  
envelope.dotNet = true;  
envelope.setOutputSoapObject(soapObject);  
HttpTransportSE transport = new HttpTransportSE(endPoint);  
try {  
transport.call(soapAction, envelope);  
} catch (IOException e) {  
// TODO Auto-generated catch block  
e.printStackTrace();  
} catch (XmlPullParserException e) {  
// TODO Auto-generated catch block  
e.printStackTrace();  
}  
// 获取返回的数据  
SoapObject object = (SoapObject) envelope.bodyIn;  
// 获取返回的结果  
String result = object.getProperty(0).toString();  
Message message = handler.obtainMessage();  
message.obj = result;  
handler.sendMessage(message);  
}  
}).start();  
}  
private Handler handler = new Handler(){  
public void handleMessage(android.os.Message msg) {  
// 将WebService得到的结果返回给TextView  
tv_result.setText(msg.obj.toString());  
};  
};  
}  

webService:基于SOAP协议的远程调用标准,通过webService可以将不用的操作系统平台,不同的计算机语言,不同的技术整合到一起。
调用webService需要导入jar包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包,这个包在网上可以下载,至于导入的方法 ,右键项目,选择最后一项properties-->Java build path-->Libraies-->Add external Jars 选择相应的路径下的jar文件就OK了,然后记得在Order and Export 里面将选择的jar文件勾选上。
调用webService的步骤分为7个:

  1. 实例化soapObject对象,指定Soap的命名空间(从相关文档中可以查看WSDL命名空间以及调用方法)
View Code   
  
//命名空间  
private static final String serviceNameSpace="http://WebXml.com.cn/";  
//调用方法(获得支持的城市)  
private static final String getSupportCity="getSupportCity";  
  
//实例化SoapObject对象  
SoapObject request=new SoapObject(serviceNameSpace, getSupportCity);  

2.假设方法有参数的话,添加调用的方法的参数

//获得序列化的Envelope  
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);  
envelope.bodyOut=request;  

request.addProperties("参数名称","参数值");
3.设置SOAP请求信息(参数部分为SOAP版本号,与自己要调用的SOAP版本必须一致,也就是你导入到工程中的jar相对应的版本)

//获得序列化的Envelope  
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);  
envelope.bodyOut=request;  

4.注册Enelope
(new MarshalBase64()).register(envelope);
5.构建传输对象,并指定WDSL文档中的URL

//请求URL  
private static final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";  
//Android传输对象  
AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL);  
transport.debug=true;  

6.调用webService(其中参数为1:命名空间+方法名称,envelope对象);

transport.call(serviceNameSpace+getWeatherbyCityName, envelope);  

7.解析返回数据:

if(envelope.getResponse()!=null){  
return parse(envelope.bodyIn.toString());  
}  
  
/************** 
 * 解析XML 
 * @param str 
 * @return 
 */  
private static List parse(String str){  
String temp;  
List list=new ArrayList();  
if(str!=null && str.length()>0){  
int start=str.indexOf("string");  
int end=str.lastIndexOf(";");  
temp=str.substring(start, end-3);  
String []test=temp.split(";");  
  
 for(int i=0;i

这样就成功了,这里有个地址是提供Webservice天气预报服务的,我们这里只提供了获取城市列表:

//命名空间  
private static final String serviceNameSpace="http://WebXml.com.cn/";  
//请求URL  
private static final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";  
//调用方法(获得支持的城市)  
private static final String getSupportCity="getSupportCity";  
//调用城市的方法(需要带参数)  
private static final String getWeatherbyCityName="getWeatherbyCityName";  
//调用省或者直辖市的方法(获得支持的省份或直辖市)  
private static final String getSupportProvince="getSupportProvince";  

在浏览器中输入WSDL serverUrl 就可以看到一些可供调用的方法:
我们选择国内外主要城市或者省份的调用方法:getSurpportPrivence(),然后调用之后你会发现返回给我们的是XML文档:

   
-   
  直辖市   
  特别行政区   
  黑龙江   
  吉林   
  辽宁   
  内蒙古   
  河北   
  河南   
  山东   
  山西   
  江苏   
  安徽   
  陕西   
  宁夏   
  甘肃   
  青海   
  湖北   
  湖南   
  浙江   
  江西   
  福建   
  贵州   
  四川   
  广东   
  广西   
  云南   
  海南   
  新疆   
  西藏   
  台湾   
  亚洲   
  欧洲   
  非洲   
  北美洲   
  南美洲   
  大洋洲   
    

class:

public class WebServiceHelper {  
 
//WSDL文档中的命名空间  
private static final String targetNameSpace="http://WebXml.com.cn/";  
//WSDL文档中的URL  
private static final String WSDL="http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";  
 
//需要调用的方法名(获得本天气预报Web Services支持的洲、国内外省份和城市信息)  
private static final String getSupportProvince="getSupportProvince";  
//需要调用的方法名(获得本天气预报Web Services支持的城市信息,根据省份查询城市集合:带参数)  
private static final String getSupportCity="getSupportCity";  
//根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数  
private static final String getWeatherbyCityName="getWeatherbyCityName";  
  
  
/******** 
 * 获得州,国内外省份和城市信息 
 * @return 
 */  
public  List getProvince(){  
List provinces=new ArrayList();  
String str="";  
SoapObject soapObject=new SoapObject(targetNameSpace,getSupportProvince);  
//request.addProperty("参数", "参数值");调用的方法参数与参数值(根据具体需要可选可不选)  
  
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);  
envelope.dotNet=true;  
envelope.setOutputSoapObject(soapObject);//envelope.bodyOut=request;  
  
  
AndroidHttpTransport httpTranstation=new AndroidHttpTransport(WSDL);  
//或者HttpTransportSE httpTranstation=new HttpTransportSE(WSDL);  
try {  
  
httpTranstation.call(targetNameSpace+getSupportProvince, envelope);  
SoapObject result=(SoapObject)envelope.getResponse();  
//下面对结果进行解析,结构类似json对象  
//str=(String) result.getProperty(6).toString();  
  
int count=result.getPropertyCount();  
for(int index=0;index getCitys(String province){  
List citys=new ArrayList();  
SoapObject soapObject=new SoapObject(targetNameSpace,getSupportCity);  
soapObject.addProperty("byProvinceName", province);  
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);  
envelope.dotNet=true;  
envelope.setOutputSoapObject(soapObject);  
  
AndroidHttpTransport httpTransport=new AndroidHttpTransport(WSDL);  
try {  
httpTransport.call(targetNameSpace+getSupportCity, envelope);  
SoapObject result=(SoapObject)envelope.getResponse();  
int count=result.getPropertyCount();  
for(int index=0;index> list=new ArrayList>();  
  
  
Map map=new HashMap();  
  
//城市名  
bean.setCityName(soapObject.getProperty(1).toString());  
//城市简介  
bean.setCityDescription(soapObject.getProperty(soapObject.getPropertyCount()-1).toString());  
//天气实况+建议  
bean.setLiveWeather(soapObject.getProperty(10).toString()+"\n"+soapObject.getProperty(11).toString());  
  
//其他数据  
//日期,  
String date=soapObject.getProperty(6).toString();  
//---------------------------------------------------  
String weatherToday="今天:" + date.split(" ")[0];
weatherToday+="\n天气:"+ date.split(" ")[1];   
weatherToday+="\n气温:"+soapObject.getProperty(5).toString();  
weatherToday+="\n风力:"+soapObject.getProperty(7).toString();  
weatherToday+="\n";  
  
List icons=new ArrayList();  
  
icons.add(parseIcon(soapObject.getProperty(8).toString()));
icons.add(parseIcon(soapObject.getProperty(9).toString()));  
   
map.put("weatherDay", weatherToday);  
map.put("icons",icons);  
list.add(map);  
  
  
  
  
//-------------------------------------------------  
map=new HashMap();   
date=soapObject.getProperty(13).toString();  
String weatherTomorrow="明天:" + date.split(" ")[0];
weatherTomorrow+="\n天气:"+ date.split(" ")[1];   
weatherTomorrow+="\n气温:"+soapObject.getProperty(12).toString();  
weatherTomorrow+="\n风力:"+soapObject.getProperty(14).toString();  
weatherTomorrow+="\n";  
  
icons=new ArrayList();  
   
icons.add(parseIcon(soapObject.getProperty(15).toString()));
icons.add(parseIcon(soapObject.getProperty(16).toString()));  
  
map.put("weatherDay", weatherTomorrow);  
map.put("icons",icons);  
list.add(map);  
//--------------------------------------------------------------  
map=new HashMap();   
  
date=soapObject.getProperty(18).toString();  
String weatherAfterTomorrow="后天:" + date.split(" ")[0];
weatherAfterTomorrow+="\n天气:"+ date.split(" ")[1];   
weatherAfterTomorrow+="\n气温:"+soapObject.getProperty(17).toString();  
weatherAfterTomorrow+="\n风力:"+soapObject.getProperty(19).toString();  
weatherAfterTomorrow+="\n";  
  
icons=new ArrayList();  
icons.add(parseIcon(soapObject.getProperty(20).toString()));
icons.add(parseIcon(soapObject.getProperty(21).toString()));  
  
map.put("weatherDay", weatherAfterTomorrow);  
map.put("icons",icons);  
list.add(map);   
//--------------------------------------------------------------  
  
bean.setList(list);  
return bean;  
}  
  
 //解析图标字符串  
 private int parseIcon(String data){  
// 0.gif,返回名称0,  
 int resID=32;  
 String result=data.substring(0, data.length()-4).trim();  
  // String []icon=data.split(".");  
  // String result=icon[0].trim();  
  //   Log.e("this is the icon", result.trim());  

   if(!result.equals("nothing")){  
   resID=Integer.parseInt(result.trim());  
   }  
 return resID;  
 //return ("a_"+data).split(".")[0];   
 }   
}  

以及帮助类:

public class WebServiceUtil {  
 
//命名空间  
private static final String serviceNameSpace="http://WebXml.com.cn/";  
//请求URL  
private static final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";  
//调用方法(获得支持的城市)  
private static final String getSupportCity="getSupportCity";  
//调用城市的方法(需要带参数)  
private static final String getWeatherbyCityName="getWeatherbyCityName";  
//调用省或者直辖市的方法(获得支持的省份或直辖市)  
private static final String getSupportProvince="getSupportProvince";  
   
/************* 
 * @return城市列表 
 *************/  
public static List getCityList(){  
//实例化SoapObject对象  
SoapObject request=new SoapObject(serviceNameSpace, getSupportCity);  
//获得序列化的Envelope  
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);  
envelope.bodyOut=request;  
(new MarshalBase64()).register(envelope);  
//Android传输对象  
AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL);  
transport.debug=true;  
  
//调用  
try {  
transport.call(serviceNameSpace+getWeatherbyCityName, envelope);  
if(envelope.getResponse()!=null){  
return parse(envelope.bodyIn.toString());  
}  
  
} catch (IOException e) {  
// TODO Auto-generated catch block  
e.printStackTrace();  
} catch (XmlPullParserException e) {  
// TODO Auto-generated catch block  
e.printStackTrace();  
}  
  
  
return null;  
}  
  
  
public static List getProviceList(){  
//实例化SoapObject对象  
SoapObject request=new SoapObject(serviceNameSpace, getSupportProvince);  
//获得序列化的Envelope  
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);  
envelope.bodyOut=request;  
(new MarshalBase64()).register(envelope);  
//Android传输对象  
AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL);  
transport.debug=true;  
  
//调用  
try {  
transport.call(serviceNameSpace+getWeatherbyCityName, envelope);  
if(envelope.getResponse()!=null){  
return null;  
}  
  
} catch (IOException e) {  
// TODO Auto-generated catch block  
e.printStackTrace();  
} catch (XmlPullParserException e) {  
// TODO Auto-generated catch block  
e.printStackTrace();  
}  
  
  
return null;  
}   
  
/************* 
 * @param cityName 
 * @return 
 *************/  
public static String getWeather(String cityName){  
   
return "";  
}  
  
/************** 
 * 解析XML 
 * @param str 
 * @return 
 */  
private static List parse(String str){  
String temp;  
List list=new ArrayList();  
if(str!=null && str.length()>0){  
int start=str.indexOf("string");  
int end=str.lastIndexOf(";");  
temp=str.substring(start, end-3);  
String []test=temp.split(";");  
  
 for(int i=0;i

以上就是显示天气预报的全部代码
转载自:http://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html
还可以调用免费的WebService显示手机号码的归属地,但是每天免费的次数是有限的,同样是调用WebService
但是调用WebService的时候,因为是网络操作,在Android 4.0.3以上的版本貌似会出现异常,后经过google发现是在
新版的Android系统里面,因为对网络的访问限制的更加严格,所以会报NetWorkOnMainThreadException 说的是对
于网络的访问不能放在主线程,这样的解决方案有两种,一种是开辟新的现成访问网络,call webService放在子线程中运行
还有一个解决方案是使用StricMode进行优化,strictMode有很多不同的策略进行优化,当开发者违背某个规则的时候,每个策略都
有不用的方法去提示用户。
显示号码归属地的代码:

package com.nenglong.wsclient;

import java.io.IOException;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.StrictMode;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

/**
 * @author huanglong Android 平台调用WebService(手机号码归属地查询)
 */
public class MainActivity extends Activity {
    private TextView tv_result;
    private EditText et_phone;
    private Button btn_query;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        tv_result = (TextView) findViewById(R.id.result_text);
        et_phone = (EditText) findViewById(R.id.et);
        btn_query = (Button) findViewById(R.id.btn_query);
        btn_query.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String phone = et_phone.getText().toString().trim();
                if ("".equals(phone) || phone.length() < 7) {
                    et_phone.setText("您输入的手机号码有误");
                    et_phone.requestFocus();
                    tv_result.setText("");
                    return;
                }
                getRemoteInfo(phone);
            }
        });
    }

    /**
     * 查询号码段归属地的方法
     * 
     * @param phone
     *手机号码段
     */
    public void getRemoteInfo(final String phone) {
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                // TODO Auto-generated method stub
                // 命名空间
                String nameSpace = "http://WebXml.com.cn/";
                // 调用方法的名称
                String methodName = "getMobileCodeInfo";
                // EndPoint
                String endPoint = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
                // SOAP Action
                String soapAction = "http://WebXml.com.cn/getMobileCodeInfo";
                // 指定WebService的命名空间和调用方法
                SoapObject soapObject = new SoapObject(nameSpace, methodName);
                // 设置需要调用WebService接口的两个参数mobileCode UserId
                soapObject.addProperty("mobileCode", phone);
                soapObject.addProperty("userId", "");
                // 生成调用WebService方法调用的soap信息,并且指定Soap版本
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                        SoapEnvelope.VER10);
                envelope.bodyOut = soapObject;
                // 是否调用DotNet开发的WebService
                envelope.dotNet = true;
                envelope.setOutputSoapObject(soapObject);
                HttpTransportSE transport = new HttpTransportSE(endPoint);
                try {
                    transport.call(soapAction, envelope);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (XmlPullParserException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                // 获取返回的数据
                SoapObject object = (SoapObject) envelope.bodyIn;
                // 获取返回的结果
                String result = object.getProperty(0).toString();
                Message message = handler.obtainMessage();
                message.obj = result;
                handler.sendMessage(message);
            }
        }).start();
    }
    private Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            // 将WebService得到的结果返回给TextView
            tv_result.setText(msg.obj.toString());
        };
    };
}

你可能感兴趣的:(Android WebService(基于SOAP协议))