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應用)請求進行判斷,獲取不一樣類型的請求響應信息。安全
例以下面代碼:服務器
- 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)
- throws ServletException, IOException {
- response.setContentType("text/html");
- response.setCharacterEncoding("UTF-8");
- 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.io.IOException;
- 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;
- try {
- // 發送GET請求
- httpResponse = httpClient.execute(get);
- // 服務器端返回相應
- if (httpResponse.getStatusLine().getStatusCode() == 200) {
- // 獲取服務器相應的字符串
- result = EntityUtils.toString(httpResponse.getEntity());
- }
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return result;
- }
- /**
- * POST方式帶參數請求
- *
- * @param 發送url請求
- * @param rawParams
- * @return 服務器相應的字符串
- */
- public static String postRequest(String url, Map<String, String> rawParams) {
- HttpPost post = new HttpPost(url);
- HttpResponse httpResponse = null;
- String result = null;
- List<NameValuePair> params = new ArrayList<NameValuePair>();
- for (String key : rawParams.keySet()) {
- // 封裝請求參數
- params.add(new BasicNameValuePair(key, rawParams.get(key)));
- }
- try {
- // 設置請求參數
- post.setEntity(new UrlEncodedFormEntity(params, "GBK"));
- // 發送POST請求
- httpResponse = httpClient.execute(post);
- // 若是服務器成功的返回相應
- if (httpResponse.getStatusLine().getStatusCode() == 200) {
- //獲取服務器響應的字符串
- result=EntityUtils.toString(httpResponse.getEntity());
- }
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return result;
- }
- }
3.開發Android應用程序,對JSON(或者其它格式數據交互對象)進行處理,獲取須要的信息。
Android應用開發相對於已有的Web服務應用而言是獨立的,能夠將應用程序對服務器的請求和響應從新抽象一層,在已有的Web服務請求響應的控制層進行擴展和特定格式的數據信息封裝。