android客户端访问pc服务器端的复杂数据类型
2014-03-21 19:54
495 查看
一、服务器端:
使用XFire引擎创建Webservice,方法很简单,网上也有许多例子,不再赘述。代码目录结构如下:
IBusLocationService为接口类,BusLocationServiceImpl为实现类。CBusLocation为自定义类,即要传递的类型。IBusLocationService.aegis.xml为XFire的映射配置文件。CFinalData为自己写的辅助类,不用关心。
二、客户端:
不要忘记引入Jar包(ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar)。代码目录结构如下:
MainActivity_BusLocation为Activity类。MainActivity为另一个Activity,调用网络webservice查询天气应用,不用关心。MarshalDouble是为了实现Double类序列化的类。CBusLocation为客户端的自定义类型,与服务器端的自定义类型相对。
1.CBusLocation类源码:
一定要实现接口KvmSerializable,并注意NameSpace属性
注意参数设置,及addMapping方法的调用。addMapping方法的第一个参数为服务器端的自定义类的命名空间,第二个参数为类名,第三个参数为客户端自定义类。
以上,这样就完成了。看似简单,可是费了我两三天的时间,追根究底还是自己懂得太少,写出来希望对大家有用。
由于项目需要使用webservice与android所以学习了一下。期间遇到了许多问题,最大的收获就是,信心与坚持。有信心,相信自己能够解决问题;坚持住,遇到困难不退缩。电子信息技术如浩瀚大海,咱们做开发的,不可能什么技术都会,只有不断学习才能跟上技术发展。向所有程序猿致敬,信心与坚持,与君共勉!
借鉴文章:怎样通过ksoap2发送复杂参数给web service方法(How to send complex type using ksoap2)
源码链接:http://download.csdn.net/detail/rjliulei/6523113
转自http://blog.csdn.net/rjliulei/article/details/14521961
使用XFire引擎创建Webservice,方法很简单,网上也有许多例子,不再赘述。代码目录结构如下:
IBusLocationService为接口类,BusLocationServiceImpl为实现类。CBusLocation为自定义类,即要传递的类型。IBusLocationService.aegis.xml为XFire的映射配置文件。CFinalData为自己写的辅助类,不用关心。
二、客户端:
不要忘记引入Jar包(ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar)。代码目录结构如下:
MainActivity_BusLocation为Activity类。MainActivity为另一个Activity,调用网络webservice查询天气应用,不用关心。MarshalDouble是为了实现Double类序列化的类。CBusLocation为客户端的自定义类型,与服务器端的自定义类型相对。
1.CBusLocation类源码:
package com.jianboBusLocation.entity.sub; import java.util.Hashtable; import org.ksoap2.serialization.KvmSerializable; import org.ksoap2.serialization.PropertyInfo; import org.ksoap2.serialization.SoapObject; import java.lang.Double; public class CBusLocation implements KvmSerializable{ /** * */ public static Class CBUSLOCATION_CLASS = CBusLocation.class; private int iDataNum; private Double dBusLatitude; private Double dBusLongitude; public static final String NAMESPACE = "http://entity.jianboBusLocation.com"; public CBusLocation(){} public CBusLocation(int iDataNum, Double dLatitude, Double dLongitude){ this.iDataNum = iDataNum; this.dBusLatitude = dLatitude; this.dBusLongitude = dLongitude; } /* public CBusLocation(SoapObject obj){ this.iDataNum = Integer.parseInt(obj.getProperty("iDataNum").toString()); this.dBusLatitude = Double.parseDouble(obj.getProperty("dBusLatitude").toString()); this.dBusLongitude = Double.parseDouble(obj.getProperty("dBusLongitude").toString()); } */ @Override public Object getProperty(int arg0) { // TODO Auto-generated method stub switch(arg0){ case 2: return iDataNum; case 1: return dBusLongitude; case 0: return dBusLatitude; } return null; } @Override public int getPropertyCount() { // TODO Auto-generated method stub return 3; } @Override public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo info) { // TODO Auto-generated method stub switch(arg0){ case 2: info.type=PropertyInfo.INTEGER_CLASS;//设置info type的类型 info.name="iDataNum"; info.namespace = NAMESPACE; break; case 1: info.type=Double.class; info.name="dBusLongitude"; info.namespace = NAMESPACE; break; case 0: info.type=Double.class; info.name="dBusLatitude"; info.namespace = NAMESPACE; break; default: break; } } @Override public void setProperty(int index, Object value) { // TODO Auto-generated method stub switch(index){ case 2: iDataNum = Integer.valueOf(value.toString()); break; case 1: dBusLongitude = Double.valueOf(value.toString()); break; case 0: dBusLatitude = Double.valueOf(value.toString()); break; default: break; } } public int getIDataNum() { return iDataNum; } public void setIDataNum(int iDataNum) { this.iDataNum = iDataNum; } public double getDBusLatitude() { return dBusLatitude; } public void setDBusLatitude(Double dBusLatitude) { this.dBusLatitude = dBusLatitude; } public double getDBusLongitude() { return dBusLongitude; } public void setDBusLongitude(Double dBusLongitude) { this.dBusLongitude = dBusLongitude; } }
一定要实现接口KvmSerializable,并注意NameSpace属性
public void getRemoteInfo_My(String phoneSec) throws SoapFault { // 命名空间 String nameSpace = "http://jianboBusLocation.com"; // 调用的方法名称 String methodName = "getBusLocation"; // EndPoint String endPoint = "http://192.168.0.7:8088/BusLocationService/services/BusLocationService"; // SOAP Action String soapAction = "http://jianboBusLocation.com/getBusLocation"; // 指定WebService的命名空间和调用的方法名 SoapObject rpc = new SoapObject(nameSpace, methodName); // 设置需调用WebService接口需要传入的两个参数mobileCode、userId //rpc.addProperty("in0", "my test"); rpc.addProperty("iTime", 1); CBusLocation cTemp = new CBusLocation(); cTemp.setIDataNum(2); cTemp.setDBusLatitude(2.0); cTemp.setDBusLongitude(2.0); PropertyInfo objekt = new PropertyInfo(); <SPAN style="WHITE-SPACE: pre"> </SPAN>objekt.setName("inBusLoc"); <SPAN style="WHITE-SPACE: pre"> </SPAN>objekt.setValue(cTemp); <SPAN style="WHITE-SPACE: pre"> </SPAN>objekt.setType(cTemp.getClass()); <SPAN style="WHITE-SPACE: pre"> </SPAN>objekt.setNamespace(CBusLocation.NAMESPACE); <SPAN style="WHITE-SPACE: pre"> </SPAN>rpc.addProperty(objekt); // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10); envelope.bodyOut = rpc; // 设置是否调用的是dotNet开发的WebService envelope.dotNet = false; envelope.encodingStyle="UTF-8"; // 等价于envelope.bodyOut = rpc; envelope.setOutputSoapObject(rpc); envelope.addMapping("http://entity.jianboBusLocation.com", "CBusLocation", CBusLocation.CBUSLOCATION_CLASS); //Marshal class MarshalDouble marshaldDouble = new MarshalDouble(); marshaldDouble.register(envelope); HttpTransportSE transport = new HttpTransportSE(endPoint); transport.debug = true; try { // 调用WebService transport.call(soapAction, envelope); } catch (Exception e) { e.printStackTrace(); } // 获取返回的数据 SoapObject object = (SoapObject) envelope.getResponse(); //CBusLocation cLoc = new CBusLocation(object); // 获取返回的结果 //2个数,1经度,0纬度 resultString = <SPAN style="WHITE-SPACE: pre"> </SPAN>"latitude : " + object.getProperty(0).toString() + "\nlongitude : " + object.getProperty(1).toString() + "\ndata number : " + object.getProperty(2).toString(); }
注意参数设置,及addMapping方法的调用。addMapping方法的第一个参数为服务器端的自定义类的命名空间,第二个参数为类名,第三个参数为客户端自定义类。
以上,这样就完成了。看似简单,可是费了我两三天的时间,追根究底还是自己懂得太少,写出来希望对大家有用。
由于项目需要使用webservice与android所以学习了一下。期间遇到了许多问题,最大的收获就是,信心与坚持。有信心,相信自己能够解决问题;坚持住,遇到困难不退缩。电子信息技术如浩瀚大海,咱们做开发的,不可能什么技术都会,只有不断学习才能跟上技术发展。向所有程序猿致敬,信心与坚持,与君共勉!
借鉴文章:怎样通过ksoap2发送复杂参数给web service方法(How to send complex type using ksoap2)
源码链接:http://download.csdn.net/detail/rjliulei/6523113
转自http://blog.csdn.net/rjliulei/article/details/14521961
相关文章推荐
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(6):服务器端和客户端数据类型的自动转换:复杂类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法:服务器端和客户端数据类型的自动转换:复杂类型
- 判断访问浏览器客户端类型(pc,mac,ipad,iphone,android)
- android端和pc端使用usb进行socket通信,其中android是服务器端,pc是客户端。如何实现安卓端输入的数据通过按钮发送到pc端?
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(6):服务器端和客户端数据类型的自动转换:复杂类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(6):服务器端和客户端数据类型的自动转换:复杂类型
- Android客户端和服务器端数据交互
- Android客户端与服务器端的json数据交互(很详细)
- Android客户端使用HttpClient发起web数据访问
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(9):服务器端和客户端数据类型的自动转换:DataTable和DataSet
- 多个Android客户端同步服务器端表中数据架构分析
- Android Parceable传递复杂类型数据
- Miko Android自学之路 WifiDirect中文最强详解,如何传输数据,如何设置GroupOwener,如何设置客户端以及服务器端
- Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍
- Android客户端向服务器端发送数据的流程(1)
- android之Intent复杂数据的传递(ArrayList<String>类型的数据)
- 数据类型转换(客户端与服务器端)
- Android中数据文件解析(Json解析【从服务器端获取数据并且解析,显示在客户端上面】)
- android之Intent复杂数据的传递(ArrayList<Object>类型的数据)
- android客户端从服务器端获取json数据并解析