Android中用Ksoap获取标准webservice接口返回的复杂对象Dataset学习

主题:Android项目中ksopa2访问标准webservice接口,若返回数据为一般字符串或者字符串数组则相对简单,网上大把,若是dataset,网上也有很多关于用Java把返回结果转为xml文件的,但觉得那样会多做很多工作,担心影响手机用户体验,研究了一下午,也不算难,只是解析麻烦点,见代码

一、返回的结果Dataset集,如图:

Android中用Ksoap获取标准webservice接口返回的复杂对象Dataset学习_第1张图片

Android中用Ksoap获取标准webservice接口返回的复杂对象Dataset学习_第2张图片


二、KsoapHelper网络请求类

Android常用第三方插件Ksoap2一般用法就不介绍了,可自行百度了解,下面是我的调试解析类,可解析成功运用到项目中去:

/**
 * @Title KsoapHelper.java
 * @Package com.intech.net.ksoap2
 * @Description TODO
 * @Author Don
 * @Date 2014-6-26 下午3:10:41
 * @Version V1.0
 */
package com.intech.net.ksoap2;


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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

import android.util.Log;

import com.intech.android.utils.FileUtil;
import com.intech.dinghuohui.model.Dealers;
/**
 * @author Administrator
 *
 */
public class KsoapHelper {

	
	/** 默认超时时间30S **/
	public static int timeOut = 30000 ;
	
	/** webservice 地址 **/
	public static String webServiceUrl;
	
	/** 命名空间 **/
	public static String nameSpace ;
	
	/** SOAP规范 **/
	public static int soapVersion = SoapEnvelope.VER12 ;
	
	private SoapObject soapObject ;
	
//	public
	
	private KsoapHelper(){
		
	}
	
	/** 初始化 **/
	public static void initKsoapHelper(String _webServiceUrl,String _nameSpace){
		initKsoapHelper(timeOut, _webServiceUrl,_nameSpace,soapVersion);
	}
	/** 初始化 **/
	public static void initKsoapHelper(String _webServiceUrl,String _nameSpace,int _version){
		initKsoapHelper(timeOut, _webServiceUrl,_nameSpace,_version);
	}
	
	/** 初始化 **/
	public static void initKsoapHelper(int _timeOut,String _webServiceUrl,String _nameSpace,int _version){
		nameSpace = _nameSpace;
		webServiceUrl = _webServiceUrl;
		timeOut = _timeOut;
		soapVersion = _version;
	}
	
	/**
	 * 设置SoapObject对象
	 * @param methodName 设置方法
	 * @return
	 */
	public static SoapObject GetSoapObject(String methodName){
		SoapObject object = new SoapObject(nameSpace,methodName);
		return object;
	}
	/**
	 * 设置SoapObject对象
	 * @param nameSpace 设置命名空间
	 * @param methodName 设置方法
	 * @return
	 */
	public static SoapObject GetSoapObject(String nameSpace,String methodName){
		SoapObject object = new SoapObject(nameSpace,methodName);
		return object;
	}
	
	/**
	 * Ksoap 访问webservice 返回简单类型结果
	 * @param object
	 * @return
	 * @throws HttpResponseException
	 * @throws IOException
	 * @throws XmlPullParserException
	 */
	public static Object GetResult(String action,SoapObject object){
		// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
		SoapSerializationEnvelope sSEnvelope = new SoapSerializationEnvelope(soapVersion);
		sSEnvelope.bodyOut = object;
		sSEnvelope.dotNet=true;
		HttpTransportSE httpTransSE = new HttpTransportSE(webServiceUrl);
		//debug属性为true来打开调试信息
		httpTransSE.debug = true;
		SoapObject result = null;
		//方法HttpTransport.call()自己就能够发送请求给服务器、接收服务器响应并序列化SOAP消息,调用call方法是一个同步过程,需要等待它返回
		try {
			httpTransSE.call(null, sSEnvelope);
			result = (SoapObject) sSEnvelope.getResponse();
		} catch (HttpResponseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
//		// 另一种获取返回的数据方式  
		SoapObject result1 = (SoapObject) sSEnvelope.bodyIn; 
//		//打印输出调试信息
//		
		Log.e("getresponse==result", result.toString());
		Log.e("result.getPropertyCount()" , result.getPropertyCount()+"");
		Log.e("result.getProperty('diffgram')" , result.getProperty("diffgram").toString());
		Log.e("result.getProperty('diffgram').count" , ((SoapObject)result.getProperty("diffgram")).getPropertyCount()+"");
		Log.e("result.getProperty('diffgram').getProperty('NewDataSet')" , ((SoapObject)result.getProperty("diffgram")).getProperty("NewDataSet").toString());
		Log.e("result.getProperty('diffgram').getProperty('NewDataSet').count" , ((SoapObject)((SoapObject)result.getProperty("diffgram")).getProperty("NewDataSet")).getPropertyCount()+"");
		SoapObject dataset = (SoapObject) ((SoapObject)result.getProperty("diffgram")).getProperty("NewDataSet");
		List list = new ArrayList();
		for(int i=0;i>" , result.getPropertyCount()+"");
		Log.e("result.getProperty('0')>>" , result.getProperty(0).toString());
		Log.e("result.getProperty('1')>>" , result.getProperty(1).toString());
		
		return result;
	}

}
三、上述接口改返回结果为Json字符串后处理

本想叫后端哥们修改结果,用简单http+json方式,我就用原有项目框架做起来更快,而不用再整合ksoap2进项目,也不需要解析复杂对象,那意味着他不要用标准webservice接口,而用简单VS中一般处理程序通过http协议在浏览器直接输出结果即可,没想到,他只是将结果json序列化返回给我。不敢再要求,只好,仍用ksoap,只是返回结果为json字符串,相当于string处理了,而不是复杂Dataset。修改上述KsoapHelper类中获取数据方法GetResult的返回结果,即直接返回获取到string字符串即可,之后将String转为json即可。

你可能感兴趣的:(Android学习)