Android与服务器端数据交互

移动开发 Android
采用HttpClient向服务器端action请求数据,当然调用服务器端方法获取数据并不止这一种WebService也可以为我们提供所需数据,那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。

实现Android与服务器端数据交互,我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,做过JAVA ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用,当然KSOAP已经提供了基于android版本的jar包了,那么我们就开始吧:

首先下载KSOAP包:

ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar 
  • 1.

然后新建android项目:并把下载的KSOAP包放在android项目的lib目录下:右键->build path->configure build path--选择Libraries,如图:

以下分为七个步骤来调用WebService方法:

1、实例化SoapObject 对象,指定webService的命名空间(从相关WSDL文档中可以查看命名空间),以及调用方法名称。如:

//命名空间        
  private static final String serviceNameSpace="http://WebXml.com.cn/";      
//调用方法(获得支持的城市)       
  private static final String getSupportCity="getSupportCity";    
//实例化SoapObject对象           
  SoapObject request=new SoapObject(serviceNameSpace, getSupportCity);  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

2、假设方法有参数的话,设置调用方法参数

request.addProperty("参数名称","参数值"); 
  • 1.

3、设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致):

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

4、注册Envelope,

(new MarshalBase64()).register(envelope); 
  • 1.

5、构建传输对象,并指明WSDL文档URL:

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

6、调用WebService(其中参数为1:命名空间+方法名称,2:Envelope对象):

transport.call(serviceNameSpace+getWeatherbyCityName, envelope); 
  • 1.

7、解析返回数据:

if(envelope.getResponse()!=null){  
        return parse(envelope.bodyIn.toString());  
   }  
/**************   
* 解析XML      
 * @param str   
* @return  
*/      
private static List<String> parse(String str){   
   String temp;          
   List<String> list=new ArrayList<String>();  
   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<test.length;i++){   
    if(i==0){   
    temp=test[i].substring(7);   
   }else{  
     temp=test[i].substring(8);   
   }  
     int index=temp.indexOf(",");  
     list.add(temp.substring(0, index));  
   }  
 }    
     return list;  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.

这样就成功啦。那么现在我们就来测试下吧,这里有个地址提供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"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

#p#

我们选择获取国内外主要城市或者省份的方法吧:getSupportProvice,然后调用,你会发现浏览器返回给我们的是xml文档:

<?xml version="1.0" encoding="utf-8" ?> 
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
xmlns="http://WebXml.com.cn/">    
<string>直辖市</string>     
<string>特别行政区</string>     
<string>黑龙江</string>     
<string>吉林</string>     
<string>辽宁</string>    
<string>内蒙古</string>     
<string>河北</string>     
<string>河南</string>     
<string>山东</string>     
<string>山西</string>     
<string>江苏</string>     
<string>安徽</string>     
<string>陕西</string>     
<string>宁夏</string>     
<string>甘肃</string>     
<string>青海</string>     
<string>湖北</string>     
<string>湖南</string>     
<string>浙江</string>     
<string>江西</string>     
<string>福建</string>     
<string>贵州</string>     
<string>四川</string>     
<string>广东</string>     
<string>广西</string>    
<string>云南</string>     
<string>海南</string>     
<string>新疆</string>     
<string>西藏</string>     
<string>台湾</string>     
<string>亚洲</string>     
<string>欧洲</string>     
<string>非洲</string>     
<string>北美洲</string>     
<string>南美洲</string>     
<string>大洋洲</string>     
</ArrayOfString> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.

我们可以用 listview来显示:

那么下面我将给出全部代码:

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<String> getProvince(){         
 List<String>   
provinces=new ArrayList<String>();         
 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<count;index++){                  
provinces.add(result.getProperty(index).toString());             
 }                     
 } catch (IOException e) { // TODO Auto-generated catch block              
e.printStackTrace();          
} catch (XmlPullParserException e) { // TODO Auto-generated catch block              
e.printStackTrace();         
 }           
return provinces;      
}         
 /**********       
* 根据省份或者直辖市获取天气预报所支持的城市集合      
 * @param province      
 * @return       
*/      
public  List<String> getCitys(String province){          
List<String> citys=new ArrayList<String>();         
 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<count;index++){                 
 citys.add(result.getProperty(index).toString());            
  }                     
 } catch (IOException e) { // TODO Auto-generated catch block             
 e.printStackTrace();         
 } catch (XmlPullParserException e) { // TODO Auto-generated catch block              
e.printStackTrace();          
}          
 return citys;    
  }         
 /***************************      
 * 根据城市信息获取天气预报信息      
 * @param city       
* @return       
***************************/     
public  WeatherBean getWeatherByCity(String city){                 
 WeatherBean bean=new WeatherBean();         
 SoapObject soapObject=new SoapObject(targetNameSpace,getWeatherbyCityName);          
soapObject.addProperty("theCityName",city);//调用的方法参数与参数值(根据具体需要可选可不选)                 
 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+getWeatherbyCityName, envelope);              
SoapObject result=(SoapObject)envelope.getResponse();              
//下面对结果进行解析,结构类似json对象              
bean=parserWeather(result);                       
} catch (IOException e) {              
// TODO Auto-generated catch block              
e.printStackTrace();          
} catch (XmlPullParserException e) {       
 // TODO Auto-generated catch block             
 e.printStackTrace();         
 }           
return bean;     
 }         
 /**      
 * 解析返回的结果      
 * @param soapObject      
 */     
 protected   WeatherBean parserWeather(SoapObject soapObject){   
WeatherBean bean=new WeatherBean();   
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();   
Map<String,Object> map=new HashMap<String,Object>();//城市名         
 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<Integer> icons=new ArrayList<Integer>();             
 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<String,Object>();           
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<Integer>();                   
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<String,Object>();                  
 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<Integer>();        
  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];       
}  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.

上就是我所作的查询天气预报的全部核心代码了,读者可以根据注释以及本文章了解下具体实现,相信很快就搞明白了,运行结果如下:

到此结束,下一节主要是socket通信了。

【编辑推荐】

Android布局属性详解

Android环境变量的设置

Android Activity和Intent机制学习笔记

在Android应用程序中使用Internet数据

Android用户界面设计之创建列表视图程序

责任编辑:zhaolei 来源: 互联网
相关推荐

2012-10-15 13:40:15

IBMdw

2022-05-07 15:54:56

小熊派鸿蒙

2014-01-15 10:06:30

vFlash

2024-02-22 13:47:40

2012-05-07 13:55:41

JavaJava Web

2022-04-27 15:12:06

TCP服务器鸿蒙

2021-09-02 10:49:25

Node.jsPHP服务器开发

2014-11-14 11:03:56

微软.NET

2023-06-30 08:00:00

漏洞网络安全SSTI

2013-12-25 11:01:16

JavaScript

2015-11-04 14:14:56

HTTP网络协议

2017-12-06 22:29:53

2009-06-10 16:25:02

2010-08-06 15:35:06

Flex服务器

2021-07-27 06:14:32

服务器端移动端性能测试

2010-04-21 13:18:33

RAC负载均衡配置

2009-02-16 16:30:23

OperaTurbo服务器

2010-05-27 18:49:38

SVN入门

2010-08-27 10:23:26

DHCP服务器

2010-10-15 08:57:15

PHP多进程
点赞
收藏

51CTO技术栈公众号