Android調用基於.net的WebService


在實際開發項目中,有時候會為Android開發團隊提供一些接口,一般是以asmx文件的方式來承載。而公布出去的數據一般上都是標准的json數據。但是在實際過程中,發現Android團隊那邊並不是通過將JSON序列化成類對象來進行解析的(通過parse json數據來進行),所以我這里要提供以下我自己在實際項目中,使用的方法,以期起到拋磚引玉的作用。

我們先在.net端建立兩個WebService對象:

首先,建立一個名稱為GetPhoneUnCharged的對象,用來獲取暫未充值完成的手機列表用戶。

 1:    #region 總體說明:獲取未發送的手機充值列表
 2:          [WebMethod(Description = "總體說明:獲取未發送的手機充值列表")]
 3:          public string GetPhoneUnCharged()
 4:          {
 5:              using (var e = new brnmallEntities())
 6:              {
 7:                  var result = from p in e.cha_phonecharge where p.chargestateid == 1 select p;
 8:                  return JsonConvert.SerializeObject(result.ToList());
 9:              }
10:          }
11:          #endregion
12:  

從上面代碼可以看出,我們返回的是被Newtonsoft.json組件序列化的json字符串數組。

我們從捕獲的截圖中,可以看到我們返回的JSON字符串數據:

image

然后,在.net中,我們創建如下的DTO對象:

 1:  public class cha_phonechargedto
 2:  {
 3:         public int phonechargeid { get; set; }
 4:         public int uid { get; set; }
 5:         public string chargephone { get; set; }
 6:         public DateTime? chargetime { get; set; }
 7:         public int chargestateid { get; set; }
 8:         public string chargestate { get; set; }
 9:         public decimal chagemoney { get; set; }
10:         public string chargememo { get; set; }
11:         public int chargetypeid { get; set; }
12:         public int serviceid { get; set; }
13:   
14:         public string username { get; set; } //用戶名稱
15:         public string chargetype { get; set; } //支付,還是繳費
16:         public string servicename { get; set; } //運營商名稱
17:  
18:         public bool error { get; set; }
19:         public string message { get; set; }
20:     }
21:   

這個DTO對象主要就是返回一些用戶數據以供Android客戶端調用。

下面我們來添加我們的WebService方法:

 1:   #region 總體說明:手工繳費(兼容性放法)
 2:          [WebMethod(Description = "總體說明:手工繳費(兼容性放法)", MessageName = "ManualCharge")]
 3:          public string ManualCharge(string phonechargeid)
 4:          {
 5:              int phonechargeidInInt32;
 6:              if (string.IsNullOrEmpty(phonechargeid))
 7:                  return JsonConvert.SerializeObject(new cha_phonechargedto() { error = true, message = "繳費序號不能為空!" });
 8:              if (!Int32.TryParse(phonechargeid, out phonechargeidInInt32))
 9:                  return JsonConvert.SerializeObject(new cha_phonechargedto() { error = true, message = "繳費序號只能為數字型!" });
10:   
11:              using (var e = new brnmallEntities())
12:              {
13:                  var result = (from p in e.cha_phonecharge where p.phonechargeid == phonechargeidInInt32 select p).FirstOrDefault();
14:                  if (result == null)
15:                      return JsonConvert.SerializeObject(new cha_phonechargedto() { error = true, message = "未找到繳費記錄!" });
16:                  else
17:                  {
18:                      //如果處於可以繳費的模式
19:                      if (result.chargestateid == 1)
20:                      {
21:                          result.chargestateid = 2; //繳費成功
22:                          result.chargememo = "於[" + DateTime.Now.ToString("yyyy年MM月dd日 hh:mm:ss") + "]自動繳費成功";
23:                          try
24:                          {
25:                              e.SaveChanges();
26:                              return JsonConvert.SerializeObject(new cha_phonechargedto() { error = false, message = "手工繳費成功!" });
27:                          }
28:                          catch (Exception ex)
29:                          {
30:                              return JsonConvert.SerializeObject(new cha_phonechargedto() { error = true, message = ex.Message });
31:                          }
32:                      }
33:                      else if (result.chargestateid == 2) //如果已經繳費,則無需重復繳費
34:                      {
35:                          result.chargememo = "於[" + DateTime.Now.ToString("yyyy年MM月dd日 hh:mm:ss") + "]有重復繳費行為,已被自動處理";
36:                      }
37:                      else  //其他未知原因,導致的不能繳費的情況
38:                      {
39:                          result.chargememo = "於[" + DateTime.Now.ToString("yyyy年MM月dd日 hh:mm:ss") + "]發現本記錄異常,無法被自動繳費";
40:                      }
41:                  }
42:                  return JsonConvert.SerializeObject(new cha_phonechargedto() { error = true, message = "手工繳費成功!" });
43:              }
44:          }
45:          #endregion
46:  

這個方法最后返回的數據為String類型的標准的JSON數據。在返回值中,我已經利用Newtonsoft.json組件將對象轉換成了標准的json數據。

以上就是.net WebService所有的內容了。我們再來看看Android端怎么進行的。

首先,我們需要下載兩個用於json數據解析的jar包:gson-2.2.4.jarksoap2-android-assembly-2.4-jar-with-dependencies.jar,將其添加到libs目錄下。

其次,我們需要在Android端,創建一個一模一樣的DTO對象:cha_phonechargedto。

然后,開始編寫解析代碼如下:

  1:  public void run() {
  2:              System.out.println("Polling...");
  3:   
  4:              String nameSpace = "http://tempuri.org/";
  5:              String serviceURL = "http://******:8001/ChargeService.asmx";
  6:   
  7:              String methodName = "GetPhoneUnCharged";
  8:              String soapAction = "http://tempuri.org/GetPhoneUnCharged";
  9:              SoapObject request = new SoapObject(nameSpace, methodName);
 10:   
 11:              SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
 12:                      SoapEnvelope.VER11);
 13:              envelope.bodyOut = request;
 14:              envelope.dotNet = true;
 15:              HttpTransportSE ht = new HttpTransportSE(serviceURL);
 16:              ht.debug = false;
 17:              try {
 18:                  ht.call(soapAction, envelope);
 19:                  if (envelope.getResponse() != null) {
 20:                      String result = envelope.getResponse().toString();
 21:                      Log.d("result", result);
 22:   
 23:                      Gson gson = new Gson();
 24:                      List<cha_phonechargedto> ps = gson.fromJson(result,new TypeToken<List<cha_phonechargedto>>() {}.getType());
 25:   
 26:                      for (int i = 0; i < ps.size(); i++) {
 27:                          cha_phonechargedto p = ps.get(i);
 28:   
 29:                          String phone = p.getChargephone().toString(); // 電話號碼
 30:                          String fee = p.getChagemoney().toString(); // 繳費金額
 31:                          String stuffID = p.getServiceid().toString(); // ServiceCompany  1:電信  2:移動 3:聯通
 32:                          String phonechargeid = p.getPhonechargeid().toString();
 33:                          int feeEx= new Double(fee).intValue();
 34:   
 35:                          System.out.println(phone + "|" + fee + "|" + stuffID+ "|" + phonechargeid);
 36:   
 37:                          String messageDaemon = "";
 38:                          String messageTo = "";
 39:                          String smsCenterPhone = "";
 40:   
117:                          if (stuffID.equalsIgnoreCase("3")) // 聯通 Send To 10011
118:                          {
119:                              messageDaemon = "××××××" + phone + "#" + feeEx;
120:                              messageTo = "10011";
121:                              smsCenterPhone = "13000000000";
122:                              Log.d("result", messageDaemon + "|" + messageTo + "|"+ smsCenterPhone);
123:   
124:                              String methodName1 = "ManualCharge";
125:                              String soapAction1 = "http://tempuri.org/ManualCharge";
126:                              SoapObject request1 = new SoapObject(nameSpace,methodName1);
127:                              // 如果有參數,可以加入,沒有的話,則忽略
128:                              Log.d("phonechargeid", phonechargeid);
129:                              request1.addProperty("phonechargeid", phonechargeid);
130:   
131:                              SoapSerializationEnvelope envelope1 = new SoapSerializationEnvelope(SoapEnvelope.VER11);
132:                              envelope1.bodyOut = request1;
133:                              envelope1.dotNet = true;
134:   
135:                              ht.call(soapAction1, envelope1);
136:                              if (envelope1.getResponse() != null) {
137:                                  String operation = envelope1.getResponse().toString();
138:                                  Log.d("operation", operation);
139:   
140:                                  Gson gsonResponse = new Gson();
141:                                  cha_phonechargedto resultResponse = gsonResponse.fromJson(operation,new TypeToken<cha_phonechargedto>() {}.getType());
142:   
143:                                  boolean errorflag = resultResponse.getError();
144:   
145:                                  if(!errorflag) //can send message out 
146:                                   {
147:                                      // Send Message Out
148:                                      SmsManager smsManager = SmsManager.getDefault();
149:                                      smsManager.sendTextMessage(messageTo,smsCenterPhone, messageDaemon, null, null);
150:   
151:                                      Log.d("result", messageDaemon + " have sent");
152:                                  }
153:                              }
154:                          }
155:   
156:                          Thread.sleep(2000);
157:                      }
158:                  }
159:              } catch (Exception e) {
160:                  e.printStackTrace();
161:   
162:              }
163:          }
164:      }

首先,建立SoapObject來承載要Invoke的函數名稱,然后通過Gson的fromJson方法,將WebService提供的JSON數據,序列化到List<cha_phonechargedto>對象中去。最后就是通過一系列的邏輯,來實現軟件需要實現的目的。

其實說起來挺簡單的。

但是也許有人會問,如果我不知道你們提供的cha_phonechargedto對象里面的內容,咋辦呢? 其實很簡單,網上已經有專門提供JSON數據類生成的服務了,我們可以拿好我們的json數據,直接去生成類去。

我們的json數據如下:

[
{
"$id": "1",
"phonechargeid": 1626,
"uid": 9,
"chargephone": "18239236557",
"chargetime": "2015-02-02T18:05:39.8",
"chargestateid": 1,
"chagemoney": 50,
"chargememo": "網頁端手機充值",
"chargetypeid": 2,
"serviceid": 2,
"EntityKey": {
"$id": "2",
"EntitySetName": "cha_phonecharge",
"EntityContainerName": "brnmallEntities",
"EntityKeyValues": [
{
"Key": "phonechargeid",
"Type": "System.Int32",
"Value": "1626"
}
]
}
},
{
"$id": "3",
"phonechargeid": 1634,
"uid": 9,
"chargephone": "18239236557",
"chargetime": "2015-02-03T10:11:57.143",
"chargestateid": 1,
"chagemoney": 50,
"chargememo": "網頁端手機充值",
"chargetypeid": 2,
"serviceid": 2,
"EntityKey": {
"$id": "4",
"EntitySetName": "cha_phonecharge",
"EntityContainerName": "brnmallEntities",
"EntityKeyValues": [
{
"Key": "phonechargeid",
"Type": "System.Int32",
"Value": "1634"
}
]
}
}
]

然后將上面數據拷貝到http://tools.wx6.org/json2csharp/這個網站中,點擊生成按鈕,可以生成如下的類對象:

 1:   
 2:   
 3:  public class EntityKeyValues
 4:  {
 5:      public string Key { get; set; }
 6:      public string Type { get; set; }
 7:      public int Value { get; set; }
 8:  }
 9:  public class EntityKey
10:  {
11:      public string EntitySetName { get; set; }
12:      public string EntityContainerName { get; set; }
13:      public List<EntityKeyValues> EntityKeyValues { get; set; }
14:  }
15:  public class Root
16:  {
17:      public int Phonechargeid { get; set; }
18:      public int Uid { get; set; }
19:      public long Chargephone { get; set; }
20:      public DateTime Chargetime { get; set; }
21:      public int Chargestateid { get; set; }
22:      public int Chagemoney { get; set; }
23:      public string Chargememo { get; set; }
24:      public int Chargetypeid { get; set; }
25:      public int Serviceid { get; set; }
26:      public EntityKey EntityKey { get; set; }
27:  }
28:   

看看,是不是很相似呢? 相信你把這些對象直接轉變為java中的dto對象,該是很簡單的了。

上面有多余字段,你可以不加某些屬性,就可以過濾掉不想要的字段。

期望對你有用,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM