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,這個是個新鮮玩意,稍後講到如何使用! 這兩個類庫下載地址
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月份寫的,今天檢查程式碼又看到了,當時自己耗費了好長時間,因此分享出來,供大家參考,少走彎路!如果有錯誤和疏忽之處,望大家不吝指教!
相關推薦
Android與webservice進行實體物件的傳遞
我是半吊子的安卓開發者,之前沒接觸過java的網站開發。因此在開發android應用程式中,首選工具就是VS2010+Eclipse。那麼android開發中與伺服器的通訊也理所當然的使用webservice。 android程式與伺服器端的
Android與Asp.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的字串並對其進行封裝。這裡就遇
swagger與spring 進行物件傳遞
問題: 1.swagger解決傳遞json以為引數的方法 2.spring接受實體物件 問題一: @ApiOperation(httpMethod = "POST",value = "測試能否使用application/x-www-form-urlencoded",cons
關於android中webservice使用ksoap2傳遞複雜物件的研究
android開發中需要與伺服器互動,其中就要用到webservice,google提供了ksoap的外掛,網上很多關於使用字串引數沒有問題,但是如果使用像date,decimal,以及自定義的類物件就不行了,這還要分為兩種情況: 1.date等引數需要new Ma
ASP.Net WebAPI與Ajax進行跨域數據交互時Cookies數據的傳遞
調整 ucc header set 定義 div ren ext domain 前言 最近公司項目進行架構調整,由原來的三層架構改進升級到微服務架構(準確的說是服務化,還沒完全做到微的程度,顆粒度沒那麽細),遵循RESTFull規範,使前後端完全分離,實現大前端思想。由於是
android與C# 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入門之android與rn初始化參數的傳遞
具體實現 如何 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 { /** *
android與PC,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資料表沒有某些屬性欄位,實體類有,進行獲取
Android與Java伺服器端資料互動和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以及引數傳遞與返