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()方法即可实现登录信息的验证。
注:此次写得比较粗糙,有时间再补充完善。