Android 采用KSoap访问传入实体对象的webservice

Android客户端中与后台数据交互,经常用到webservice,而android对webservice支持不是十分强,程序开发中经常使用第三方KSoap包来访问后台数据,本文重点说明如何利用KSoap来访问输入参数为实体bean对象的webservice。

       首先,在本地新建立一个对应的传入实体bean的对象,该bean必须进行序列化。

代码如下所示:

      

/**
 *   
* 类名称:EmployeeInfoBean   
* 类描述:   登录验证: EmployeeInfo Bean,用于验证和设置用户基本信息  
*
 */
public class EmployeeInfo implements KvmSerializable{

    protected String departName;//部门名称
    protected String department;//部门ID
    protected String id;//用户编号
    protected String loginName;//登录名
    protected String password;//用户密码
    protected String status;//登录状态

    public EmployeeInfo(){
    	
    }
    /**
     * 
    * 创建一个新的实例 EmployeeInfo.   
    * 设置访问后台的对象对应的输入参数
    * @param loginName 用户名
    * @param password  密码
     */
    public EmployeeInfo(String loginName,String password){
    	this.loginName = loginName;
    	this.password = password;
    }
    
    /**此处为传入后台的对象中对应的输入参数**/
    @Override
	public Object getProperty(int arg0) {
		switch(arg0){
			case 0:
				return this.loginName;
			case 1:
				return this.password;
			default :
				return null;
		}
		
	}

    /**传入的对象中对应的输入参数的个数**/
	@Override
	public int getPropertyCount() {
		
		return 2;
	}
	/**对象中有几个输入参数,此处就需要设置对应的输入参数**/
	@Override
	public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
		switch(arg0){
			case 0:
				arg2.type = PropertyInfo.STRING_CLASS;
				arg2.name = "loginName";
				break;
			
			case 1:
				arg2.type = PropertyInfo.STRING_CLASS;
				arg2.name = "password";
				break;
			default:
				break;
		}
	}
	/**对象中有几个输入参数,此处就需要设置对应的输入参数**/
	@Override
	public void setProperty(int arg0, Object arg1) {
		switch(arg0){
			case 0:{
				this.loginName = arg1.toString();
				break;
			}
			case 1:{
				this.password = arg1.toString();
				break;
			}
			default:{
				
				break;
			}
		}
		
	}
	/**
	* getInfo(获取后台返回的EmployeeInfo对象对应的属性值)     
	* @param name   
	* @return String DOM对象   
	* @Exception 异常对象   
	* @since  CodingExample Ver(编码范例查看) 1.1
	 */
	public static EmployeeInfo getInfo(Object object){
		EmployeeInfo employeeInfo = new EmployeeInfo();
		try{
			if(object.equals(null)){
				return employeeInfo;
			}
			/**对返回的对象object进行详细解析,此部分省略,根据实际情况处理**/
			/**解析完后,可以设置EmployeeInfo对象相关属性的详细值*/
			
		}catch(Exception ex){
			ex.printStackTrace();
		}
		return employeeInfo;
	}
	
    
    public String getDepartName() {
        return departName;
    }

    public void setDepartName(String value) {
        this.departName = value;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String value) {
        this.department = value;
    }

  
    public String getId() {
        return id;
    }
 
    public void setId(String value) {
        this.id = value;
    }
  
    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String value) {
        this.loginName = value;
    }
   
    public String getPassword() {
        return password;
    }
    
    public void setPassword(String value) {
        this.password = value;
    }
  
    public String getStatus() {
        return status;
    }
   
    public void setStatus(String value) {
        this.status = value;
    }

}

第二步,创建解析webservice对应的实体通用类。

代码如下所示:

/**
 *      
* 类名称:KSoapManageUtil   
* 类描述:   KSoap管理类,管理访问webservice的返回值
*
 */
public class KSoapManageUtil {
	
	private Context context = null;
	private Object soapInfo = null;
	 //系统配置信息文件
    private SysConfig sysConfig = null;
    
	/*构造方法*/
	public KSoapManageUtil(Context context){
		this.context = context;
		//加载系统参数,进行初始化
    	sysConfig = new SysConfig(context);
	}
	
	/**
	 * 
	* setSoapInfo(通过传入的方法及属性,设置后台返回信息)     
	* @param methodName 方法名
	* @param propertys 方法中的参数:以键值对形式存放指定传入值(HashMap<Object,Object>指的是<参数名,参数值>) 
	* @return String DOM对象   
	* @Exception 异常对象   
	* @since  CodingExample Ver(编码范例查看) 1.1
	 */
	public void setSoapInfo(String methodName,ArrayList<HashMap<Object,Object>> propertys){
		// webservice 访问URL
		String serviceUrl = sysConfig.getShared().getString("WebService_URL", "");
		// webservice 命名空间
		String NameSpace = sysConfig.getShared().getString("NAMESPACE", "");
		//调用的方法methodName
		//命名空间+方法名
		String SOAP_Action = NameSpace + methodName;
		// 实例化SoapObject对象
		SoapObject request = new SoapObject(NameSpace, methodName);
		// 设置参数,参数名不一定需要跟调用的服务器端的参数名相同,只需要对应的顺序相同即可
		for(HashMap<Object,Object> info:propertys){
			Set<Object> set=info.keySet();
			Iterator<Object> iterator=set.iterator();
			
			while (iterator.hasNext()) {
				String key=(String)iterator.next();
				request.addProperty(key,info.get(key));
			 }
		}
		//soapHeader 
		/*Element[] header = new Element[1]; 
		
        header[0] = new Element().createElement(NameSpace, "wsse:UsernameToken");
        Element userName = new Element().createElement(NameSpace, "wsse:Username");
        userName.addChild(Node.TEXT, "admin"); 
        header[0].addChild(Node.ELEMENT, userName); 
        
        Element pass = new Element().createElement(NameSpace, "wsse:Password");
        pass.addChild(Node.TEXT, "123"); 
        header[0].addChild(Node.ELEMENT, pass); */
		//
		// 使用soap1.0 协议创建Envelop对象,此处对应后台webservice的soap协议版本
		SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
				SoapEnvelope.VER10);
		//envelope.headerOut=header; 
		envelope.bodyOut = request;
		envelope.dotNet = false; 
		// 将SoapObject对象设置为SoapSerializationEnvelope对象的传出SOAP消息
		envelope.setOutputSoapObject(request); 
		// 创建httpTransportSE传输对象
		HttpTransportSE ht = new HttpTransportSE(serviceUrl);
		
		//ht.debug = true;
		try {
			// 调用webService
			//ht.call(SOAP_Action, envelope);
			ht.call(null, envelope);
			if (envelope.getResponse() != null) {
				//获取响应信息
				this.soapInfo =envelope.getResponse();		
			} else {
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	* getSoapInfo(获取后台指定方法的对象信息)     
	* @param name   
	* @return String DOM对象   
	* @Exception 异常对象   
	* @since  CodingExample Ver(编码范例查看) 1.1
	 */
	public Object getSoapInfo(){
		
		return this.soapInfo;
	}
}

第三步,建立用到的配置文件信息类。

代码如下:

/**
 * 
* 类名称:SysConfig   
* 类描述:   用户信息以及服务地址保存,采用SharedPreferences方式存储数据  
*
 */
public class SysConfig {
	//保存配置信息的SharedPreferences对象
	private	SharedPreferences share;
	//编辑对象
    private Editor edit;
      
    /**   
    * 创建一个新的实例 SysConfig. 初始化所需对象   
    *   
    * @param context   
    */   
	public SysConfig(Context context){
    	//初始化存储对象
    	share = context.getSharedPreferences("sysconfig", Context.MODE_PRIVATE);
    	//初始化
    	initWebServiceConfig();
    	//获取编辑对象
    	edit = share.edit();
    	
    }
    
	/**
	 * 
	* initWebServiceConfig(初始化)     
	* @param name   
	* @return String DOM对象   
	* @Exception 异常对象   
	* @since  CodingExample Ver(编码范例查看) 1.1
	 */
	public void initWebServiceConfig(){
		 edit=share.edit();
		 
		 edit.putString("NAMESPACE", "com.test.service");
		 edit.putString("SOAP_ACTION", null);
		 //webservice访问地址
		 //记录"webservice"变量
		 if(!share.contains("WebService_URL"))
		 {
			 edit.putString("WebService_URL","http://192.168.0.203:8088/TestCxfService/TestService?wsdl");
 		 }
		 
		 edit.commit();
	}
	
    /**   
    * initSysData(初始化系统所需参数)      
    * @param    
    * @return  
    * @Exception 
    * @since  CodingExample Ver(编码范例查看) 1.1   
    */   
     public  void initSysData(){
    	 edit=share.edit();
    	//记录"登录名"变量
		 if(!share.contains("loginName"))
		 {
		   edit.putString("loginName", "admin");
		 }
		 //记录"密码"变量
		 if(!share.contains("userPwd"))
		 {
			 edit.putString("userPwd", "1");	 
		 }
		 //记录所属部门ID
		 if(!share.contains("department")){
			 edit.putString("department", "");
		 }
		//记录用户ID
		 if(!share.contains("id")){
			 edit.putString("id", "00000000-0000-0000-0000-000000000000");
		 }
		 //记录登录状态
		 if(!share.contains("status")){
			 edit.putString("status", "1");
		 }
		
		 //提交
		 edit.commit();	
    }
     
    /**   
    * getShared(获取SharedPreferences)   
    * @param name   
    * @return SharedPreferences
    * @Exception 异常对象   
    * @since  CodingExample Ver(编码范例查看) 1.1   
    */   
    public SharedPreferences getShared(){
    	return share;
    }
      
    /**   
    * getEditor(获取编辑对象)   
    * @param  
    *@return Editor
    * @Exception 异常对象   
    * @since  CodingExample Ver(编码范例查看) 1.1   
    */   
    public Editor getEditor(){
    	return edit;
    }
      
    /**   
    * getURL(获取存储的服务地址)     
    * @param     
    * @Exception 异常对象   
    * @since  CodingExample Ver(编码范例查看) 1.1   
    */   
    public String getURL(){
    	return share.getString("WebService_URL", "-1");
    }
}

第四步,建立验证登录信息的服务。

代码如下所示:

/**
 * 
 * 类名称:VerifyManageService 
 * 类描述: 验证登录信息的服务 
 * 
 */
public class VerifyManageService {
	//上下文对象
	private Context context = null;
	// 系统配置信息文件
	private SysConfig sysConfig = null;
	// 验证返回信息的标志位
	private int flag = 0;

	/* 构造方法 */
	public VerifyManageService(Context context) {
		this.context = context;
		// 加载系统参数,进行初始化
		sysConfig = new SysConfig(context);
	}

	/**
	 * 
	 * LoginVerify(验证登陆信息是否正确)
	 * 
	 * @param loginName
	 *            登录名
	 * @param loginPwd
	 *            登录密码
	 * @return 1,验证成功;2,验证失败
	 * @Exception 异常对象
	 * @since CodingExample Ver(编码范例查看) 1.1
	 */
	public int LoginVerify(String loginName, String loginPwd) {
		try {
			// 获取访问webservice的类
			KSoapManageUtil ksoap = new KSoapManageUtil(context);
			// 设置访问后台webservice方法的相关输入参数
			ArrayList<HashMap<Object, Object>> propertys = new ArrayList<HashMap<Object, Object>>();
			HashMap<Object, Object> hm = new HashMap<Object, Object>();
			EmployeeInfo employeeInfo = new EmployeeInfo(loginName, loginPwd);
			hm.put("arg0", employeeInfo);
			propertys.add(hm);
			// 设置验证登录信息的对应的方法 及输入值
			ksoap.setSoapInfo("Login", propertys);
			//获取后台返回的用户基本信息
			employeeInfo = EmployeeInfo.getInfo(ksoap.getSoapInfo());
			if ("1".equals(employeeInfo.getStatus().trim())) {// 登录成功
				flag = 1;
				//存储用户基本信息
				sysConfig.getEditor().putString("loginName", loginName);// 登录名
				sysConfig.getEditor().putString("department",employeeInfo.getDepartment());// 部门编号
				sysConfig.getEditor().putString("id", employeeInfo.getId());// 用户编号
				sysConfig.getEditor().putString("status",employeeInfo.getStatus().trim());// 用户登录状态
				sysConfig.getEditor().commit();//提交
				
			} else {// 登录失败
				flag = 2;
			}
		} catch (Exception ex) {
			ex.printStackTrace();
			flag = 2;
		}
		return flag;
	}

}

在activity通过调用LoginVerify()方法即可实现登录信息的验证。


注:此次写得比较粗糙,有时间再补充完善。


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值