安卓


我是半吊子的安卓开发者,之前没接触过java的网站开发。因此在开发android应用程序中,首选工具就是VS2010+Eclipse。那么android开发中与服务器的通讯也理所当然的使用webservice。

        android程序与服务器端的数据交互无非是对象的接收与发送。在网络中能够传递的除了值类型还有json和xml。估计刚学习android开发的同学也和我当初一样,遇到过这个难题——如何安全顺畅的在客户端与服务器端进行数据传递。

        先说说使用到第三方类库。android项目中使用了ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar,这个类库如何使用大家可以谷哥度娘哈,网上一大堆!在webservice项目中使用了Newtonsoft.Json.dll,这个是个新鲜玩意,稍后讲到如何使用!  这两个类库下载地址http://download.csdn.net/detail/wuwo333/4634813

       1、值类型的传递

             值类型通过ksoap可以直接进行传递,这里就不多说了!利用ksoap,值类型的变量即可作参数,也可以当作返回值。

       2、在android端获取服务器端的数据列表。

             先说说项目结构。webservice的项目中我建立了Model层,Android中建立了Model的包。这两个是对应的,每个model的字段名称必须一致。就拿图片作为对象来说吧。

             Webservices中ImageModel.cs

            

  1. public class ImageModel  
  2.    {  
  3.        public string Id { getset; }  
  4.   
  5.        public string Name { getset; }  
  6.   
  7.        public string Path { getset; }  
  8.   
  9.        public string FId { getset; }  
  10.   
  11.        public string FIdType { getset; }  
  12.   
  13.        public string FileExtension { getset; }  
  14.   
  15.        public string FileSize { getset; }  
  16.   
  17.        public string Adder { getset; }  
  18.   
  19.        public string AddTime { getset; }  
  20.    }  
 public class ImageModel
    {
        public string Id { get; set; }

        public string Name { get; set; }

        public string Path { get; set; }

        public string FId { get; set; }

        public string FIdType { get; set; }

        public string FileExtension { get; set; }

        public string FileSize { get; set; }

        public string Adder { get; set; }

        public string AddTime { get; set; }
    }


        在C#中可以将实体对象直接序列化为xml进行传递。

  1. [WebMethod(Description = "获取单个图片")]  
  2. public ImageModel GetImageModel(string id)  
  3. {  
  4.     return new ImageModel();  
  5. }  
  6.   
  7. [WebMethod(Description = "获取图片列表")]  
  8. public List<ImageModel> GetImageModels(string id)  
  9. {  
  10.     return new List<ImageModel>();  
  11. }  
        [WebMethod(Description = "获取单个图片")]
        public ImageModel GetImageModel(string id)
        {
            return new ImageModel();
        }

        [WebMethod(Description = "获取图片列表")]
        public List<ImageModel> GetImageModels(string id)
        {
            return new List<ImageModel>();
        }


       在调用webservice时,这两个方法的返回值都以标准的xml形式展现。大家可以发布后自己用浏览器测试。

        在android端,以下代码为了方便大家使用,我将几个类中的方法进行了整合,大家弄明白后可以自己进行重构。

  1. public static ArrayList<ImageModel> getImageModels(String id) {  
  2.         String methodName = "GetImageModels";  
  3.         PropertyInfo[] propertyInfos = new PropertyInfo[1];  
  4.         propertyInfos[0] = new PropertyInfo();  
  5.         propertyInfos[0].setName("id");  
  6.         propertyInfos[0].setValue(id);  
  7.   
  8.         SoapObject imgSoapObject = (SoapObject) getObject(  
  9.                 methodName, propertyInfos);  
  10.         ArrayList<ImageModel> models=new ArrayList<ImageModel>();  
  11.             if (imgSoapObject != null) {  
  12.                 for (int i = 0; i < imgSoapObject.getPropertyCount(); i++) {  
  13.                     SoapObject imgObject = (SoapObject) imgSoapObject  
  14.       .getProperty(i);  
  15.     ImageModel imgModel = new ImageModel();  
  16.     imgModel.Id = WebServiceParameter.getPropertyString(imgObject,  
  17.       "Id");  
  18.     imgModel.Name = WebServiceParameter.getPropertyString(  
  19.       imgObject, "Name");  
  20.     imgModel.Path = WebServiceParameter.fileUrl  
  21.       + WebServiceParameter.getPropertyString(imgObject,  
  22.         "Path");                    models.add(imgModel);  
  23.                 }  
  24.             }  
  25.           
  26.         return models;  
  27.     }  
  28.   
  29.     /** 
  30.      * webservices命名空间 
  31.      */  
  32.     public static final String NAMESPACE = "http://gl.ejiang.org/";  
  33.   
  34.     /** 
  35.      * 页面名称 
  36.      */  
  37.     public static String pageName = "BoilerService.asmx";  
  38.   
  39.     /** 
  40.      * webservices地址 
  41.      */  
  42.     public static String webserviceUrl = "http://888.88.88.888:9002/";  
  43.       
  44.     /** 
  45.      * 用webservice返回远程数据库数据 
  46.      *  
  47.      * @param methodName 
  48.      *            方法名 
  49.      * @param propertyInfos 
  50.      *            参数 
  51.      * @return 
  52.      */  
  53.     public static Object getObject(String methodName,  
  54.             PropertyInfo[] propertyInfos) {  
  55.         Object object = GetWebServiceData(  
  56.                 NAMESPACE, webserviceUrl + "/" + pageName,  
  57.                 NAMESPACE + methodName, methodName,  
  58.                 propertyInfos);  
  59.         return object;  
  60.     }  
  61.       
  62.     private static  Object GetWebServiceData(String iNameSpace,  
  63.             String iWebserviceURL, String iSoapAction, String iMethodName,  
  64.             PropertyInfo[] iPropertyInfo) {  
  65.         Object result = null;  
  66.         try {  
  67.             SoapObject rpc = new SoapObject(iNameSpace, iMethodName);  
  68.             for (int i = 0; i < iPropertyInfo.length; i++) {  
  69.                 rpc.addProperty(iPropertyInfo[i]);  
  70.             }  
  71.             SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(  
  72.                     SoapEnvelope.VER11);  
  73.             envelope.bodyOut = rpc;  
  74.   
  75.             envelope.dotNet = true;  
  76.             envelope.setOutputSoapObject(rpc);  
  77.             HttpTransportSE ht = new HttpTransportSE(iWebserviceURL, 5000);  
  78.             ht.debug = true;  
  79.             ht.call(iSoapAction, envelope);  
  80.             result = envelope.getResponse();  
  81.         } catch (Exception e) {  
  82.             Toast.makeText(CrashApplication.getContext(), "连接服务器失败,请检查网络设置!", Toast.LENGTH_SHORT)  
  83.             .show();  
  84.         }  
  85.           
  86.         return result;  
  87.     }  
  88.       
public static ArrayList<ImageModel> getImageModels(String id) {
		String methodName = "GetImageModels";
		PropertyInfo[] propertyInfos = new PropertyInfo[1];
		propertyInfos[0] = new PropertyInfo();
		propertyInfos[0].setName("id");
		propertyInfos[0].setValue(id);

		SoapObject imgSoapObject = (SoapObject) getObject(
				methodName, propertyInfos);
		ArrayList<ImageModel> models=new ArrayList<ImageModel>();
			if (imgSoapObject != null) {
				for (int i = 0; i < imgSoapObject.getPropertyCount(); i++) {
					SoapObject imgObject = (SoapObject) imgSoapObject
      .getProperty(i);
    ImageModel imgModel = new ImageModel();
    imgModel.Id = WebServiceParameter.getPropertyString(imgObject,
      "Id");
    imgModel.Name = WebServiceParameter.getPropertyString(
      imgObject, "Name");
    imgModel.Path = WebServiceParameter.fileUrl
      + WebServiceParameter.getPropertyString(imgObject,
        "Path");					models.add(imgModel);
				}
			}
		
		return models;
	}

	/**
	 * webservices命名空间
	 */
	public static final String NAMESPACE = "http://gl.ejiang.org/";

	/**
	 * 页面名称
	 */
	public static String pageName = "BoilerService.asmx";

	/**
	 * webservices地址
	 */
	public static String webserviceUrl = "http://888.88.88.888:9002/";
	
	/**
	 * 用webservice返回远程数据库数据
	 * 
	 * @param methodName
	 *            方法名
	 * @param propertyInfos
	 *            参数
	 * @return
	 */
	public static Object getObject(String methodName,
			PropertyInfo[] propertyInfos) {
		Object object = GetWebServiceData(
				NAMESPACE, webserviceUrl + "/" + pageName,
				NAMESPACE + methodName, methodName,
				propertyInfos);
		return object;
	}
	
	private static  Object GetWebServiceData(String iNameSpace,
			String iWebserviceURL, String iSoapAction, String iMethodName,
			PropertyInfo[] iPropertyInfo) {
		Object result = null;
		try {
			SoapObject rpc = new SoapObject(iNameSpace, iMethodName);
			for (int i = 0; i < iPropertyInfo.length; i++) {
				rpc.addProperty(iPropertyInfo[i]);
			}
			SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
					SoapEnvelope.VER11);
			envelope.bodyOut = rpc;

			envelope.dotNet = true;
			envelope.setOutputSoapObject(rpc);
			HttpTransportSE ht = new HttpTransportSE(iWebserviceURL, 5000);
			ht.debug = true;
			ht.call(iSoapAction, envelope);
			result = envelope.getResponse();
		} catch (Exception e) {
			Toast.makeText(CrashApplication.getContext(), "连接服务器失败,请检查网络设置!", Toast.LENGTH_SHORT)
			.show();
		}
		
		return result;
	}
	


       以上代码实现了在android端获取图片列表。

       3、将android端的信息上传至服务器。这个功能着实折腾了我好长时间!最初打算用xml的方式进行传递,即将每个字段以及字段的值按照xml的方式进行手动链接,但是考虑到所做的项目包含二十多个报告,每个报告有几十个字段,工作量太大且代码臃肿!后来打算用json的方式,java中对json数据格式操作相当方便。但遇到了同样的问题,在webservice端需要对json进行解析,如果手动解析,那工作量可想而知。本人呢也确实比较懒,然后就搜索了大量的资料,找到了Newtonsoft.Json.dll这个类库,它支持将json直接解析为实体对象。至此,这个问题才算解决。

            首先还是要确保android端和webservice端的model层结构一致!在上面的代码中,已经贴出了webservice端的ImageModel代码,下面是android端的ImageModel。

          

  1. import org.json.JSONException;  
  2. import org.json.JSONObject;  
  3.   
  4. public class ImageModel {  
  5.     public String Id="";  
  6.     public String Name="";  
  7.     public String Path="";  
  8.     public String FId="";  
  9.     public String FIdType="";  
  10.     public String FileExtension="";  
  11.     public String FileSize="";  
  12.     public String Adder="";  
  13.     public String AddTime="";  
  14.   
  15.     public static String ConvertToJson(ImageModel model) {  
  16.         String jsonStr = "";  
  17.         JSONObject modelJsonObject = new JSONObject();  
  18.         try {  
  19.             modelJsonObject.put("Id", model.Id);  
  20.             modelJsonObject.put("Name", model.Name);  
  21.             modelJsonObject.put("Path", model.Path);  
  22.             modelJsonObject.put("FId", model.FId);  
  23.             modelJsonObject.put("FIdType", model.FIdType);  
  24.             modelJsonObject.put("FileExtension", model.FileExtension);  
  25.             modelJsonObject.put("FileSize", model.FileSize);  
  26.             modelJsonObject.put("Adder", model.Adder);  
  27.             modelJsonObject.put("AddTime", model.AddTime);  
  28.             jsonStr = modelJsonObject.toString();  
  29.         } catch (JSONException e) {  
  30.             e.printStackTrace();  
  31.         }  
  32.         return jsonStr;  
  33.     }  
  34. }  
import org.json.JSONException;
import org.json.JSONObject;

public class ImageModel {
	public String Id="";
	public String Name="";
	public String Path="";
	public String FId="";
	public String FIdType="";
	public String FileExtension="";
	public String FileSize="";
	public String Adder="";
	public String AddTime="";

	public static String ConvertToJson(ImageModel model) {
		String jsonStr = "";
		JSONObject modelJsonObject = new JSONObject();
		try {
			modelJsonObject.put("Id", model.Id);
			modelJsonObject.put("Name", model.Name);
			modelJsonObject.put("Path", model.Path);
			modelJsonObject.put("FId", model.FId);
			modelJsonObject.put("FIdType", model.FIdType);
			modelJsonObject.put("FileExtension", model.FileExtension);
			modelJsonObject.put("FileSize", model.FileSize);
			modelJsonObject.put("Adder", model.Adder);
			modelJsonObject.put("AddTime", model.AddTime);
			jsonStr = modelJsonObject.toString();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return jsonStr;
	}
}


ConvrtToJson的主要作用就是将对象转换为Json,以便于在网络中传输。

android端进行数据的添加代码:

  1. /** 
  2.  * 将图片信息添加至远程数据库(报告) 
  3.  *  
  4.  * @param imageModel 
  5.  * @return 
  6.  */  
  7. public static Boolean addImage(ImageModel imageModel) {  
  8.     boolean result = false;  
  9.     String modelJson = ImageModel.ConvertToJson(imageModel);  
  10.     if (modelJson != null) {  
  11.         String methodNameString = "AddImage";  
  12.         PropertyInfo[] propertyInfos = new PropertyInfo[1];  
  13.         propertyInfos[0] = new PropertyInfo();  
  14.         propertyInfos[0].setName("modelJson");  
  15.         propertyInfos[0].setValue(modelJson);  
  16.         Object flag = WebServiceParameter.getObject(  
  17.                 methodNameString, propertyInfos);  
  18.         result = WebServiceParameter.getPropertyValue(flag, false);  
  19.     }   
  20.   
  21.     return result;  
  22. }  
	/**
	 * 将图片信息添加至远程数据库(报告)
	 * 
	 * @param imageModel
	 * @return
	 */
	public static Boolean addImage(ImageModel imageModel) {
		boolean result = false;
		String modelJson = ImageModel.ConvertToJson(imageModel);
		if (modelJson != null) {
			String methodNameString = "AddImage";
			PropertyInfo[] propertyInfos = new PropertyInfo[1];
			propertyInfos[0] = new PropertyInfo();
			propertyInfos[0].setName("modelJson");
			propertyInfos[0].setValue(modelJson);
			Object flag = WebServiceParameter.getObject(
					methodNameString, propertyInfos);
			result = WebServiceParameter.getPropertyValue(flag, false);
		} 

		return result;
	}


WebServiceParameter.getObject这个方法是ksoap的一次封装,大家可参考上面的代码自己写。

webservice端解析由android客户端传送的json:

  1. /// <summary>  
  2.        /// 添加附件  
  3.        /// </summary>  
  4.        /// <param name="modelJson"></param>  
  5.        /// <returns></returns>  
  6.        public static bool AddImage(string modelJson)  
  7.        {  
  8.            bool result = false;  
  9.            JsonSerializer jsonSerializer = new JsonSerializer();  
  10.            StringReader strReader = new StringReader(modelJson);  
  11.            ImageModel model = (ImageModel)jsonSerializer.Deserialize(new JsonTextReader(strReader), typeof(ImageModel));  
  12.            string strSql = @"insert into pictures_list  
  13.                               (  
  14.                                 fid,  
  15.                                 fid_type,   
  16.                                image_url,  
  17.                                file_name,  
  18.                                file_layout,  
  19.                                file_size,   
  20.                                add_men,  
  21.                                add_time)  
  22.                                values  
  23.                                (  
  24.                                :fid,   
  25.                                :fid_type,  
  26.                                :image_url,  
  27.                                :file_name,  
  28.                                :file_layout,  
  29.                                :file_size,  
  30.                                :add_men,  
  31.                                :add_time)";  
  32.            OracleParameter[] Parameter =  
  33.                {  
  34.                     new OracleParameter(":fid", OracleDbType.Number, 11),  
  35.                     new OracleParameter(":fid_type", OracleDbType.Number, 11),  
  36.                     new OracleParameter(":image_url", OracleDbType.VarChar, 100),  
  37.                     new OracleParameter(":file_name", OracleDbType.VarChar, 100),  
  38.                     new OracleParameter(":file_layout", OracleDbType.VarChar, 100),  
  39.                     new OracleParameter(":file_size", OracleDbType.VarChar, 100),  
  40.                     new OracleParameter(":add_men", OracleDbType.VarChar, 100),  
  41.                     new OracleParameter(":add_time", OracleDbType.Date)  
  42.                };  
  43.            Parameter[0].Value = Convert.ToString(model.FId);  
  44.            Parameter[1].Value = Convert.ToString(model.FIdType);  
  45.            Parameter[2].Value = Convert.ToString(model.Path);  
  46.            Parameter[3].Value = Convert.ToString(model.Name);  
  47.            Parameter[4].Value = Convert.ToString(model.FileExtension);  
  48.            Parameter[5].Value = Convert.ToString(model.FileSize);  
  49.            Parameter[6].Value = Convert.ToString(model.Adder);  
  50.            Parameter[7].Value = DateTime.Now;  
  51.            int mm = EJiang.Common.DirectDbHelperOracle.ExecuteSql(strSql, Parameter);  
  52.            if (mm > 0)  
  53.            {  
  54.                result = true;  
  55.            }  
  56.            else  
  57.            {  
  58.                result = false;  
  59.            }  
  60.   
  61.            return result;  
  62.        }  
 /// <summary>
        /// 添加附件
        /// </summary>
        /// <param name="modelJson"></param>
        /// <returns></returns>
        public static bool AddImage(string modelJson)
        {
            bool result = false;
            JsonSerializer jsonSerializer = new JsonSerializer();
            StringReader strReader = new StringReader(modelJson);
            ImageModel model = (ImageModel)jsonSerializer.Deserialize(new JsonTextReader(strReader), typeof(ImageModel));
            string strSql = @"insert into pictures_list
                               (
                                 fid,
                                 fid_type, 
                                image_url,
                                file_name,
                                file_layout,
                                file_size, 
                                add_men,
                                add_time)
                                values
                                (
                                :fid, 
                                :fid_type,
                                :image_url,
                                :file_name,
                                :file_layout,
                                :file_size,
                                :add_men,
                                :add_time)";
            OracleParameter[] Parameter =
                {
                     new OracleParameter(":fid", OracleDbType.Number, 11),
                     new OracleParameter(":fid_type", OracleDbType.Number, 11),
                     new OracleParameter(":image_url", OracleDbType.VarChar, 100),
                     new OracleParameter(":file_name", OracleDbType.VarChar, 100),
                     new OracleParameter(":file_layout", OracleDbType.VarChar, 100),
                     new OracleParameter(":file_size", OracleDbType.VarChar, 100),
                     new OracleParameter(":add_men", OracleDbType.VarChar, 100),
                     new OracleParameter(":add_time", OracleDbType.Date)
                };
            Parameter[0].Value = Convert.ToString(model.FId);
            Parameter[1].Value = Convert.ToString(model.FIdType);
            Parameter[2].Value = Convert.ToString(model.Path);
            Parameter[3].Value = Convert.ToString(model.Name);
            Parameter[4].Value = Convert.ToString(model.FileExtension);
            Parameter[5].Value = Convert.ToString(model.FileSize);
            Parameter[6].Value = Convert.ToString(model.Adder);
            Parameter[7].Value = DateTime.Now;
            int mm = EJiang.Common.DirectDbHelperOracle.ExecuteSql(strSql, Parameter);
            if (mm > 0)
            {
                result = true;
            }
            else
            {
                result = false;
            }

            return result;
        }


JsonSerializer jsonSerializer = new JsonSerializer();

StringReader strReader = new StringReader(modelJson);

ImageModel model = (ImageModel)jsonSerializer.Deserialize(new JsonTextReader(strReader), typeof(ImageModel));

利用jsonserializer这个类库直接将json转换为ImageModel。很方便吧!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值