Android客戶端應用享用傳統Web服務

      Android系統中提供了SQLite數據庫,用於本地的數據存儲,App連接到網絡就要用到專門的服務應用。目前已經存在了服務應用,想要開發一個Android移動應用用來享用已有的Web服務應用,這相似於傳統的Client -Service。不管是B/S模式仍是C/S模式,開發應用和業務處理,服務提供,數據存儲等都不可缺乏。Android很好的解決了這一問題,在現有的Web服務基礎上,搭建客戶端應用程序,共享已有的服務。html

      Apache開源項目中將Http協議訪問作了一個二次封裝,使得客戶端應用程序訪問Web服務器可以像瀏覽器訪問同樣方便(Apache-httpClient),正好Android SDK中提供了這個開源組件,爲開發客戶端應用程序訪問服務器提供支持。java

     關於Android客戶端訪問Web服務器與傳統的Web應用的架構以下圖:數據庫

     

      搗鼓了Android APP 訪問Web服務器以後,最大的感覺是C/S模式和B/S模式的概念開始模糊了,對訪問模式的考慮在技術方面將淡化,而更可能是用戶的計算機處理能力,併發訪問量,通訊實時性,可靠性,數據傳輸量,安全性這些方面衡量。apache

     想到關於B/S模式和C/S模式的糾結權衡在這個體驗事後,應該不會再有太多技術可行性上的糾結,而更多的精力投入到對程序的運行環境,功能,用戶體驗等方面思考和設計。json

    關於享用已有的Web服務,開發Android客戶端應用程序的大體流程總結以下:瀏覽器

   1.對傳統Web應用的MCV框架中的Servlet控制作相應的擴展,在不影響已有的系統的前提下,對客戶端(瀏覽器,Android應用)請求進行判斷,獲取不一樣類型的請求響應信息。安全

     例以下面代碼:服務器

  
  
  
  
  1. package org.estao.servelet;  
  2.  
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.  
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.  
  11. import org.estao.business.ActionBusiness;  
  12. import org.estao.business.ActionManager;  
  13. import org.json.JSONException;  
  14. import org.json.JSONObject;  
  15.  
  16. public class SettingServlet extends HttpServlet {  
  17.  
  18.     /**  
  19.      *   
  20.      */ 
  21.     private static final long serialVersionUID = -4384397961898281821L;  
  22.  
  23.     private ActionBusiness actionBusiness;  
  24.       
  25.     public void destroy() {  
  26.         super.destroy();   
  27.     }  
  28.  
  29.       
  30.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  31.             throws ServletException, IOException {  
  32.         response.setContentType("text/html");  
  33.         response.setCharacterEncoding("UTF-8");  
  34.         doPost(request, response);  
  35.     }  
  36.  
  37.       
  38.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  39.             throws ServletException, IOException {  
  40.         response.setContentType("text/html");  
  41.         response.setCharacterEncoding("UTF-8");  
  42.         PrintWriter out = response.getWriter();  
  43.         JSONObject jsonObject=new JSONObject();  
  44.         boolean result=actionBusiness.validSetting(jsonObject);  
  45.         try {  
  46.             jsonObject.put("Result", result);  
  47.         } catch (JSONException e) {  
  48.             e.printStackTrace();  
  49.         }  
  50.         out.println(jsonObject.toString());  
  51.         out.flush();  
  52.         out.close();  
  53.     }  
  54.  
  55.       
  56.     public void init() throws ServletException {  
  57.         actionBusiness=ActionManager.getAppBusiness().getActionBusiness();  
  58.     }  
  59.  
  60. }  

      上面代碼是得到JSON格式對象,做爲響應信息。網絡

      2.在Android應用中以Http協議的方式訪問服務器,使用Apache-httpclient開發包,或者進行適用於應用的再次封裝。架構

    例以下面代碼:

  
  
  
  
  1. package org.estao.util;  
  2.  
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.  
  8. import org.apache.http.HttpResponse;  
  9. import org.apache.http.NameValuePair;  
  10. import org.apache.http.client.ClientProtocolException;  
  11. import org.apache.http.client.HttpClient;  
  12. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  13. import org.apache.http.client.methods.HttpGet;  
  14. import org.apache.http.client.methods.HttpPost;  
  15. import org.apache.http.impl.client.DefaultHttpClient;  
  16. import org.apache.http.message.BasicNameValuePair;  
  17. import org.apache.http.util.EntityUtils;  
  18.  
  19. /**  
  20.  *   
  21.  * @author Ajax  
  22.  *   
  23.  * @message Just For JSON Object Transport  
  24.  *  
  25.  */ 
  26. public class HttpUtil {  
  27.     // 建立HttpClient對象  
  28.     public static final HttpClient httpClient = new DefaultHttpClient();  
  29.     // 訪問Web服務器基礎路徑  
  30.     public static final String BASE_URL = "http://10.43.10.108:8080/estao/";  
  31.  
  32.     /**  
  33.      * GET方式無參數請求  
  34.      *   
  35.      * @param 發送url請求  
  36.      * @return 服務器相應的字符串  
  37.      * @throws IOException  
  38.      */ 
  39.     public static String getRequest(String url) {  
  40.         HttpGet get = new HttpGet(url);  
  41.         HttpResponse httpResponse = null;  
  42.         String result = null;  
  43.         try {  
  44.             // 發送GET請求  
  45.             httpResponse = httpClient.execute(get);  
  46.             // 服務器端返回相應  
  47.             if (httpResponse.getStatusLine().getStatusCode() == 200) {  
  48.                 // 獲取服務器相應的字符串  
  49.                 result = EntityUtils.toString(httpResponse.getEntity());  
  50.             }  
  51.         } catch (ClientProtocolException e) {  
  52.             e.printStackTrace();  
  53.               
  54.         } catch (IOException e) {  
  55.             e.printStackTrace();  
  56.         }  
  57.         return result;  
  58.     }  
  59.  
  60.     /**  
  61.      * POST方式帶參數請求  
  62.      *   
  63.      * @param 發送url請求  
  64.      * @param rawParams  
  65.      * @return 服務器相應的字符串  
  66.      */ 
  67.     public static String postRequest(String url, Map<String, String> rawParams) {  
  68.         HttpPost post = new HttpPost(url);  
  69.         HttpResponse httpResponse = null;  
  70.         String result = null;  
  71.         List<NameValuePair> params = new ArrayList<NameValuePair>();  
  72.         for (String key : rawParams.keySet()) {  
  73.             // 封裝請求參數  
  74.             params.add(new BasicNameValuePair(key, rawParams.get(key)));  
  75.         }  
  76.         try {  
  77.             // 設置請求參數  
  78.             post.setEntity(new UrlEncodedFormEntity(params, "GBK"));  
  79.             // 發送POST請求  
  80.             httpResponse = httpClient.execute(post);  
  81.             // 若是服務器成功的返回相應  
  82.             if (httpResponse.getStatusLine().getStatusCode() == 200) {  
  83.                 //獲取服務器響應的字符串  
  84.                 result=EntityUtils.toString(httpResponse.getEntity());  
  85.             }  
  86.         } catch (ClientProtocolException e) {  
  87.             e.printStackTrace();  
  88.         } catch (IOException e) {  
  89.             e.printStackTrace();  
  90.         }  
  91.         return result;  
  92.     }  
  93. }  

        3.開發Android應用程序,對JSON(或者其它格式數據交互對象)進行處理,獲取須要的信息。

       Android應用開發相對於已有的Web服務應用而言是獨立的,能夠將應用程序對服務器的請求和響應從新抽象一層,在已有的Web服務請求響應的控制層進行擴展和特定格式的數據信息封裝。

相關文章
相關標籤/搜索