1、Android与服务器端数据交互(基于SOAP协议整合android+webservice) 上一节中我们通过http协议,采用HttpClient向服务器端action请求数据。当然调用服务器端方法获取数据并不止这一种。WebService也可以为我们提供所需数据, 那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。 我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android
2、手机客户端,做过JAVA ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用,当然KSOAP已经提供了基于android版本的jar包了,那么我们就开始吧: 首先下载KSOAP包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包 然后新建android项目:并把下载的KSOAP包放在android项目的lib目录下:右键->build path->configure build path--选择Libraries,如图: 以下分为七个步骤来调用WebService方法: 第一
3、实例化SoapObject 对象,指定webService的命名空间(从相关WSDL文档中可以查看命名空间),以及调用方法名称。如: View Code //命名空间 private static final String serviceNameSpace="http://WebX //调用方法(获得支持的城市) private static final String getSupportCity="getSupportCity"; //实例化SoapObject对象 SoapObject request=new SoapObjec
4、t(serviceNameSpace, getSupportCity); 第二步:假设方法有参数的话,设置调用方法参数 request.addProperty("参数名称","参数值"); 第三步:设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致): View Code //获得序列化的Envelope SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.body
5、Out=request; 第四步:注册Envelope, (new MarshalBase64()).register(envelope); 第五步:构建传输对象,并指明WSDL文档URL: View Code //请求URL private static final String serviceURL=" //Android传输对象 AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL); transport.debug=true; 第六步:调用We
6、bService(其中参数为1:命名空间+方法名称,2:Envelope对象): View Code transport.call(serviceNameSpace+getWeatherbyCityName, envelope); 第七步:解析返回数据: View Code if(envelope.getResponse()!=null){ return parse(envelope.bodyIn.toString()); } /************** * 解析XML * @param
7、 str
* @return
*/
private static List
8、temp=str.substring(start, end-3);
String []test=temp.split(";");
for(int i=0;i 9、 }
int index=temp.indexOf(",");
list.add(temp.substring(0, index));
}
}
return list;
}
这样就成功啦。那么现在我们就来测试下吧,这里有个地址提供webService天气预报的服务的,我这里只提供获取城市列表:
View Code
//命名空间
private static final String serviceNameSpace="h 10、ttp://WebX
//请求URL
private static final String serviceURL="
//调用方法(获得支持的城市)
private static final String getSupportCity="getSupportCity";
//调用城市的方法(需要带参数)
private static final String getWeatherbyCityName="getWeatherbyCityName";
//调用省或者直辖市的方法(获得支持的省份或直辖市)
privat 11、e static final String getSupportProvince="getSupportProvince";
然后你可以在浏览器中输入地址(WSDL):serviceURL,你会看到一些可供调用的方法:
我们选择获取国内外主要城市或者省份的方法吧:getSupportProvice,然后调用,你会发现浏览器返回给我们的是xml文档:
View Code
- 17、 private static final String getWeatherbyCityName="getWeatherbyCityName";
/********
* 获得州,国内外省份和城市信息
* @return
*/
public List 18、oapObject(targetNameSpace,getSupportProvince);
//request.addProperty("参数", "参数值");调用的方法参数与参数值(根据具体需要可选可不选)
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(soapObject 19、);//envelope.bodyOut=request;
AndroidHttpTransport httpTranstation=new AndroidHttpTransport(WSDL);
//或者HttpTransportSE httpTranstation=new HttpTransportSE(WSDL);
try {
httpTranstation.call(targetNameSpace+getSupportProvince, e 20、nvelope);
SoapObject result=(SoapObject)envelope.getResponse();
//下面对结果进行解析,结构类似json对象
//str=(String) result.getProperty(6).toString();
int count=result.getPropertyCount();
for(int index=0;index 21、 provinces.add(result.getProperty(index).toString());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
22、
e.printStackTrace();
}
return provinces;
}
/**********
* 根据省份或者直辖市获取天气预报所支持的城市集合
* @param province
* @return
*/
public List 23、oapObject soapObject=new SoapObject(targetNameSpace,getSupportCity);
soapObject.addProperty("byProvinceName", province);
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(soapOb 24、ject);
AndroidHttpTransport httpTransport=new AndroidHttpTransport(WSDL);
try {
httpTransport.call(targetNameSpace+getSupportCity, envelope);
SoapObject result=(SoapObject)envelope.getResponse();
int count=result.getPropertyCount();
25、
for(int index=0;index 26、ion e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return citys;
}
/***************************
* 根据城市信息获取天气预报信息
* @param city
* @return
***************************/
public WeatherBean getWeath 27、erByCity(String city){
WeatherBean bean=new WeatherBean();
SoapObject soapObject=new SoapObject(targetNameSpace,getWeatherbyCityName);
soapObject.addProperty("theCityName",city);//调用的方法参数与参数值(根据具体需要可选可不选)
SoapSerializationEnvelope envelope=ne 28、w SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(soapObject);//envelope.bodyOut=request;
AndroidHttpTransport httpTranstation=new AndroidHttpTransport(WSDL);
//或者HttpTransportSE httpTranstation 29、new HttpTransportSE(WSDL);
try {
httpTranstation.call(targetNameSpace+getWeatherbyCityName, envelope);
SoapObject result=(SoapObject)envelope.getResponse();
//下面对结果进行解析,结构类似json对象
bean=parserWeather(result);
} catc 30、h (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bean;
}
/**
* 解析返回的结 31、果
* @param soapObject
*/
protected WeatherBean parserWeather(SoapObject soapObject){
WeatherBean bean=new WeatherBean();
List






