Android系统中提供了SQLite数据库,用于本地的数据存储,App链接到网络就要用到专门的服务应用。目前已经存在了服务应用,想要开发一个Android移动应用用来享用已有的Web服务应用,这类似于传统的Client -Service。无论是B/S模式还是C/S模式,开发应用和业务处理,服务提供,数据存储等都不可缺少。Android很好的解决了这一问题,在现有的Web服务基础上,搭建客户端应用程序,共享已有的服务。
Apache开源项目中将Http协议访问做了一个二次封装,使得客户端应用程序访问Web服务器能够像浏览器访问一样方便(Apache-httpClient),正好Android SDK中提供了这个开源组件,为开发客户端应用程序访问服务器提供支持。
关于Android客户端访问Web服务器与传统的Web应用的架构如下图:
捣鼓了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)
- 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服务请求响应的控制层进行扩展和特定格式的数据信息封装。
本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1104088,如需转载请自行联系原作者