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应用的架构如下图:

     

      捣鼓了Android APP 访问Web服务器之后,最大的感受是C/S模式和B/S模式的概念开始模糊了,对访问模式的考虑在技术方面将淡化,而更多是用户的计算机处理能力,并发访问量,通信实时性,可靠性,数据传输量,安全性这些方面衡量。

     想到关于B/S模式和C/S模式的纠结权衡在这个体验过后,应该不会再有太多技术可行性上的纠结,而更多的精力投入到对程序的运行环境,功能,用户体验等方面思考和设计。

    关于享用已有的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服务请求响应的控制层进行扩展和特定格式的数据信息封装。




本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1104088,如需转载请自行联系原作者

相关文章
|
1天前
|
存储 缓存 安全
Android系统 应用存储路径与权限
Android系统 应用存储路径与权限
5 0
Android系统 应用存储路径与权限
|
1天前
|
存储 安全 Android开发
Android系统 自定义系统和应用权限
Android系统 自定义系统和应用权限
8 0
|
2天前
|
Android开发
Android 11 添加Service服务SELinux问题
Android 11 添加Service服务SELinux问题
8 1
|
6天前
|
缓存 移动开发 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第18天】 在移动开发的世界中,打造一个既快速又流畅的Android应用并非易事。本文深入探讨了如何通过一系列创新的技术策略来提升应用性能和用户体验。我们将从用户界面(UI)设计的简约性原则出发,探索响应式布局和Material Design的实践,再深入剖析后台任务处理、内存管理和电池寿命优化的技巧。此外,文中还将讨论最新的Android Jetpack组件如何帮助开发者更高效地构建高质量的应用。此内容不仅适合经验丰富的开发者深化理解,也适合初学者构建起对Android高效开发的基础认识。
5 0
|
6天前
|
移动开发 Android开发 开发者
构建高效Android应用:采用Kotlin进行内存优化的策略
【4月更文挑战第18天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,由于设备和版本的多样性,确保应用流畅运行且占用资源少是一大挑战。本文将探讨使用Kotlin语言开发Android应用时,如何通过内存优化来提升应用性能。我们将从减少不必要的对象创建、合理使用数据结构、避免内存泄漏等方面入手,提供实用的代码示例和最佳实践,帮助开发者构建更加高效的Android应用。
10 0
|
8天前
|
缓存 负载均衡 数据库
优化后端性能:提升Web应用响应速度的关键策略
在当今数字化时代,Web应用的性能对于用户体验至关重要。本文探讨了如何通过优化后端架构和技术手段,提升Web应用的响应速度。从数据库优化、缓存机制到异步处理等多个方面进行了深入分析,并提出了一系列实用的优化策略,以帮助开发者更好地应对日益增长的用户访问量和复杂的业务需求。
12 1
|
8天前
|
缓存 监控 数据库
Flask性能优化:打造高性能Web应用
【4月更文挑战第16天】本文介绍了提升Flask应用性能的七大策略:优化代码逻辑,减少数据库查询,使用WSGI服务器(如Gunicorn、uWSGI),启用缓存(如Flask-Caching),优化数据库操作,采用异步处理与并发(如Celery、Sanic),以及持续监控与调优。通过这些手段,开发者能有效优化Flask应用,适应大型或高并发场景,打造高性能的Web服务。
|
8天前
|
缓存 移动开发 Java
构建高效的Android应用:内存优化策略
【4月更文挑战第16天】 在移动开发领域,尤其是针对资源有限的Android设备,内存优化是提升应用性能和用户体验的关键因素。本文将深入探讨Android应用的内存管理机制,分析常见的内存泄漏问题,并提出一系列实用的内存优化技巧。通过这些策略的实施,开发者可以显著减少应用的内存占用,避免不必要的后台服务,以及提高垃圾回收效率,从而延长设备的电池寿命并确保应用的流畅运行。
|
JavaScript 前端开发 API
【Web API系列教程】3.6 — 实战:处理数据(创建JavaScript客户端)
在本节,你将使用HTML、JavaScript和Knockout.js库为应用程序创建客户端。我们将按如下步骤建立客户端应用: 1, 展示books列表 2, 展示book详细信息 3, 添加一本新书 Knockout.js库使用了模型-视图-视图模型(MVVM)模式: 1, 模型是在业务域(在本例中是books和authors)中数据在服务器端的表现形式。
1031 0
|
20天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。