1. 程式人生 > >Android與webservice進行實體物件的傳遞

Android與webservice進行實體物件的傳遞

        我是半吊子的安卓開發者,之前沒接觸過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

 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進行傳遞。

        [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端,以下程式碼為了方便大家使用,我將幾個類中的方法進行了整合,大家弄明白後可以自己進行重構。

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。

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端進行資料的新增程式碼:

	/**
	 * 將圖片資訊新增至遠端資料庫(報告)
	 * 
	 * @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:

 /// <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。很方便吧!

       大家如果有更好的方法,可以分享出來!這是8月份寫的,今天檢查程式碼又看到了,當時自己耗費了好長時間,因此分享出來,供大家參考,少走彎路!如果有錯誤和疏忽之處,望大家不吝指教!

相關推薦

Androidwebservice進行實體物件傳遞

        我是半吊子的安卓開發者,之前沒接觸過java的網站開發。因此在開發android應用程式中,首選工具就是VS2010+Eclipse。那麼android開發中與伺服器的通訊也理所當然的使用webservice。         android程式與伺服器端的

AndroidAsp.net webApi引數傳遞

參考: HttpUrlConnection: package com.example.newapibean; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.

Android 通過WebService進行網路程式設計,使用工具類輕鬆實現

相信大家在平常的開發中,對網路的操作用到HTTP協議比較多,通過我們使用Get或者Post的方法呼叫一個數據介面,然後伺服器給我們返回JSON格式的資料,我們解析JSON資料然後展現給使用者,相信很多人很喜歡伺服器給我們返回JSON資料格式,因為他解析方便,也有一些JSON的

自己關於Android 通過WebService進行網路程式設計的總結

          平時在開發中,都是使用http協議傳送get或post方法,得到一個json的字串,然後解析封裝。          但是今天遇到一個專案,是使用android去呼叫WebService介面來獲取資料,得到的是一個xml的字串並對其進行封裝。這裡就遇

swaggerspring 進行物件傳遞

問題: 1.swagger解決傳遞json以為引數的方法 2.spring接受實體物件 問題一: @ApiOperation(httpMethod = "POST",value = "測試能否使用application/x-www-form-urlencoded",cons

關於androidwebservice使用ksoap2傳遞複雜物件的研究

    android開發中需要與伺服器互動,其中就要用到webservice,google提供了ksoap的外掛,網上很多關於使用字串引數沒有問題,但是如果使用像date,decimal,以及自定義的類物件就不行了,這還要分為兩種情況: 1.date等引數需要new Ma

ASP.Net WebAPIAjax進行跨域數據交互時Cookies數據的傳遞

調整 ucc header set 定義 div ren ext domain 前言 最近公司項目進行架構調整,由原來的三層架構改進升級到微服務架構(準確的說是服務化,還沒完全做到微的程度,顆粒度沒那麽細),遵循RESTFull規範,使前後端完全分離,實現大前端思想。由於是

androidC# WebService基於ksoap通信(C#篇)

ldo art fadein length col scripts append hid ldoc 1.打開VS 2013新建項目>>ASP.NET空WEB應用程序(我用的是.net 4.0) 2.在剛建立的項目上加入新建項(Web

Android--Intent組件帶參傳遞返回

puts 例子 ast pause onstop 圖標 訪問 數據頁面 .com Android 是 單例模式:   表示 application 唯一的。每個應用被啟動的時候,其實是 application 被創建。 Context 上下文:   context 是

Express框架html之間如何進行數據傳遞

enc end 加載 context 菜鳥 添加 如果 post lose 關於Node.js 的Express框架介紹,推薦看菜鳥教程的Express框架,很適合入門,這裏不再贅述,這裏主要講一下Express框架與html之間如何進行數據傳遞 我采用的是JQuery的A

ReactNative入門之androidrn初始化參數的傳遞

具體實現 如何 code ready instance manage com 返回值 自定義 1、基本理念 RN APP本質上也是原生APP,只是在原生APP中加入了React Native視圖的支持。因此獲取RN APP的啟動參數的方法原生APP是一樣的,獲取啟動參數後再

java實體物件Map轉換

import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.Map; public class MapUtil { /** *

androidPC,C#Java 利用protobuf 進行無障礙通訊【Socket】

轉自https://www.cnblogs.com/TerryBlog/archive/2011/04/23/2025654.html protobuf 是什麼?   Protocol buffers是一種編碼方法構造的一種有效而可擴充套件的格式的資料。 谷歌使用其內

使用JAXB進行JavaBean物件XML檔案的相互轉化

思想:父標籤相當於一個物件,子標籤相當於物件的屬性,然後迴圈巢狀。 JAXBContext類,是應用的入口,用於管理XML/Java繫結資訊。 Marshaller介面,將Java物件序列化為XML資料。 Unmarshaller介面,將XML資料反序列化為Java

Android系統中實現AIDL 自定義物件傳遞

  今天要在《在Android系統中實現AIDL介面回撥》這篇文章的基礎上實現AIDL自定義物件的傳遞功能。還是上一篇說到的三個專案: ├── SimpleJar ├── SimpleJarClient └── SimpleJarService 一、在SimpleJar專

MongoDB學習筆記~資料結構實體物件不一致時,它會怎麼樣?

回到目錄 對於MongoDB這個文件型弱型別資料庫,它在操作時有時給我們帶來了一些方便,如當你的mongodb資料表與現有的類實體物件不一致時,會發生一些情況,總結如下 1:mongodb資料表不存在,實體類有,進行獲取資料時,程式不出錯 2:mongodb資料表沒有某些屬性欄位,實體類有,進行獲取

AndroidJava伺服器端資料互動和Java物件轉換成JSON物件

Ticket封裝成一個類 package com.model; public class Ticket { private int ticket_id; private int price; private int user

java xml實體物件 互相轉換

本文轉載至:http://blog.csdn.net/sd4015700/article/details/39474893 最近在專案中一直出現Java物件和XML之間的相互轉換,一開始由於專案很龐大,我又是臨時排程過去,導致在按照專案組長的要求進行寫程式碼的同時,總是在這塊雲裡霧裡,最近才慢慢

Android客戶端伺服器進行通訊

在Android開發中,經常使用到與後臺進行互動,後臺人員給你一個URL,Android使用HttpURLConnection得到後臺返回的資料。這些任務是開發中經常遇到的。這裡,我們自己搭建一個簡易的後臺,來實現Android客戶端與後臺的互動。 首先,後臺

Android 自定義PopupWindow以及引數傳遞返回

在這篇部落格之前,還寫了一篇關於PopupWindow,那篇主要是關於PopupWindow彈出位置的設定。以及選擇PopupWindow佈局後的監聽。詳情看Android popupwindow 示例程式一。接下來這篇主要是講自定義PopupWindow以及引數傳遞與返