今天我来谈谈自己在android开发中,从WebService中获取数据并且解析的经验,希望能帮助到一些刚刚入门学习android开发的朋友们。也希望大家能指正我的不足~~
一、准备阶段,我们需要使用到第三方提供的类库ksoap2,可以自行到百度上搜索下载,我使用的是ksoap2-android-assembly-2.5.7-jar-with-dependencies.jar。下载后,将jar包导入到工程的lib目录下,建议连同api帮助文档一同下载。
二、我们需要在AndroidManifest里添加相应的使用权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.INTERNET"/>
三、建议将访问webservice的程序写在子线程中,线程之间的通信就是使用handler/message来传递。
四、我们需要先确定好四个非常重要的字符串内容:
String nameSpace = "http://tempuri.org/"; //webservice里的命名空间,此处用的.net默认命名空间
String methodName = "GetData"; //webservice里的要调用的方法名
String endPoint = "http://192.168.1.109/Service1.asmx"; //webservice的URL ,可以在游览器中直接打开
String soapAction = "http://tempuri.org/GetData"; //命名空间+“/”+方法名
五、准备好四个参数后我们就正式开始编写程序,来获取数据
// 新建HttpTransportSE对象
HttpTransportSE transport=new HttpTransportSE(endPoint);
try {
transport.debug=true;
//新建一个envelope(信封)对象,指定版本号VER11
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
//创建一个soapobject对象
SoapObject rpc = new SoapObject(nameSpace, methodName);
//添加输入的参数("参数名",参数值),要与方法的参数列表相同,顺序最好也一致
rpc.addProperty("name",name);
envelope.bodyOut = rpc;
envelope.dotNet = true; //是否涉及.net
transport.call(soapAction, envelope);//调用函数
if (envelope.getResponse() != null) { //判断是否有返回值
SoapObject result = (SoapObject) envelope.bodyIn; //获取返回内容
String detail = result.getProperty(0).toString(); //将返回的第一个变量取出
}
}
catch(Exception e){
//可自行编写异常处理程序
}
finally {
//可自行编写handler程序
}
六、解析数据,在开发工程中,我们获取的数据往往不是一个值,而是由多个值,也可能是多个对象组成的,这些对象以及他们的参数值都通过xml结构化存储,我们需要对xml的数据进行解析。这里就不贴出解析的具体代码。只说明原理:
要想解析数据,我们需要活用SoapObject对象,以及它所提供的getProperty()方法。xml是由许多标签层层嵌套而成,我们可以理解为每一个打标签就是SoapObject对象,获取它的子标签就需要用到getProperty()方法,然后getProperty()方法返回的是Object对象,此时我们只需要将Object对象强转成SoapObject对象即可。
望我的一点点小经验能帮助到看到这边博文的你们,如果有更好的方法希望大家与我分享分享~~