天天看點

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

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

      Apache開源項目中将Http協定通路做了一個二次封裝,使得用戶端應用程式通路Web伺服器能夠像浏覽器通路一樣友善(Apache-httpClient),正好Android SDK中提供了這個開源元件,為開發用戶端應用程式通路伺服器提供支援。

     關于Android用戶端通路Web伺服器與傳統的Web應用的架構如下圖:

<a href="http://blog.51cto.com/attachment/201212/171340665.png" target="_blank"></a>

      搗鼓了Android APP 通路Web伺服器之後,最大的感受是C/S模式和B/S模式的概念開始模糊了,對通路模式的考慮在技術方面将淡化,而更多是使用者的計算機處理能力,并發通路量,通信實時性,可靠性,資料傳輸量,安全性這些方面衡量。

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

    關于享用已有的Web服務,開發Android用戶端應用程式的大緻流程總結如下:

   1.對傳統Web應用的MCV架構中的Servlet控制做相應的擴充,在不影響已有的系統的前提下,對用戶端(浏覽器,Android應用)請求進行判斷,擷取不同類型的請求響應資訊。

     例如下面代碼:

package org.estao.servelet;  

import java.io.IOException;  

import java.io.PrintWriter;  

import javax.servlet.ServletException;  

import javax.servlet.http.HttpServlet;  

import javax.servlet.http.HttpServletRequest;  

import javax.servlet.http.HttpServletResponse;  

import org.estao.business.ActionBusiness;  

import org.estao.business.ActionManager;  

import org.json.JSONException;  

import org.json.JSONObject;  

public class SettingServlet extends HttpServlet {  

    /**  

     *   

     */ 

    private static final long serialVersionUID = -4384397961898281821L;  

    private ActionBusiness actionBusiness;  

    public void destroy() {  

        super.destroy();   

    }  

    public void doGet(HttpServletRequest request, HttpServletResponse response)  

            throws ServletException, IOException {  

        response.setContentType("text/html");  

        response.setCharacterEncoding("UTF-8");  

        doPost(request, response);  

    public void doPost(HttpServletRequest request, HttpServletResponse response)  

        PrintWriter out = response.getWriter();  

        JSONObject jsonObject=new JSONObject();  

        boolean result=actionBusiness.validSetting(jsonObject);  

        try {  

            jsonObject.put("Result", result);  

        } catch (JSONException e) {  

            e.printStackTrace();  

        }  

        out.println(jsonObject.toString());  

        out.flush();  

        out.close();  

    public void init() throws ServletException {  

        actionBusiness=ActionManager.getAppBusiness().getActionBusiness();  

}  

      上面代碼是獲得JSON格式對象,作為響應資訊。

      2.在Android應用中以Http協定的方式通路伺服器,使用Apache-httpclient開發包,或者進行适用于應用的再次封裝。

    例如下面代碼:

package org.estao.util;  

import java.util.ArrayList;  

import java.util.List;  

import java.util.Map;  

import org.apache.http.HttpResponse;  

import org.apache.http.NameValuePair;  

import org.apache.http.client.ClientProtocolException;  

import org.apache.http.client.HttpClient;  

import org.apache.http.client.entity.UrlEncodedFormEntity;  

import org.apache.http.client.methods.HttpGet;  

import org.apache.http.client.methods.HttpPost;  

import org.apache.http.impl.client.DefaultHttpClient;  

import org.apache.http.message.BasicNameValuePair;  

import org.apache.http.util.EntityUtils;  

/**  

 *   

 * @author Ajax  

 * @message Just For JSON Object Transport  

 *  

 */ 

public class HttpUtil {  

    // 建立HttpClient對象  

    public static final HttpClient httpClient = new DefaultHttpClient();  

    // 通路Web伺服器基礎路徑  

    public static final String BASE_URL = "http://10.43.10.108:8080/estao/";  

     * GET方式無參數請求  

     * @param 發送url請求  

     * @return 伺服器相應的字元串  

     * @throws IOException  

    public static String getRequest(String url) {  

        HttpGet get = new HttpGet(url);  

        HttpResponse httpResponse = null;  

        String result = null;  

            // 發送GET請求  

            httpResponse = httpClient.execute(get);  

            // 伺服器端傳回相應  

            if (httpResponse.getStatusLine().getStatusCode() == 200) {  

                // 擷取伺服器相應的字元串  

                result = EntityUtils.toString(httpResponse.getEntity());  

            }  

        } catch (ClientProtocolException e) {  

        } catch (IOException e) {  

        return result;  

     * POST方式帶參數請求  

     * @param rawParams  

    public static String postRequest(String url, Map&lt;String, String&gt; rawParams) {  

        HttpPost post = new HttpPost(url);  

        List&lt;NameValuePair&gt; params = new ArrayList&lt;NameValuePair&gt;();  

        for (String key : rawParams.keySet()) {  

            // 封裝請求參數  

            params.add(new BasicNameValuePair(key, rawParams.get(key)));  

            // 設定請求參數  

            post.setEntity(new UrlEncodedFormEntity(params, "GBK"));  

            // 發送POST請求  

            httpResponse = httpClient.execute(post);  

            // 如果伺服器成功的傳回相應  

                //擷取伺服器響應的字元串  

                result=EntityUtils.toString(httpResponse.getEntity());  

        3.開發Android應用程式,對JSON(或者其它格式資料互動對象)進行處理,擷取需要的資訊。

       Android應用開發相對于已有的Web服務應用而言是獨立的,可以将應用程式對伺服器的請求和響應重新抽象一層,在已有的Web服務請求響應的控制層進行擴充和特定格式的資料資訊封裝。

本文轉自 secondriver 51CTO部落格,原文連結:http://blog.51cto.com/aiilive/1104088,如需轉載請自行聯系原作者

繼續閱讀