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,如需转载请自行联系原作者

相关文章
|
7天前
|
弹性计算 Java 关系型数据库
Web应用上云经典架构实践教学
Web应用上云经典架构实践教学
Web应用上云经典架构实践教学
|
15天前
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
39 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
|
7天前
|
弹性计算 Java 数据库
Web应用上云经典架构实战
本课程详细介绍了Web应用上云的经典架构实战,涵盖前期准备、配置ALB、创建服务器组和监听、验证ECS公网能力、环境配置(JDK、Maven、Node、Git)、下载并运行若依框架、操作第二台ECS以及验证高可用性。通过具体步骤和命令,帮助学员快速掌握云上部署的全流程。
|
20天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
45 14
|
21天前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
7天前
|
弹性计算 负载均衡 安全
云端问道-Web应用上云经典架构方案教学
本文介绍了企业业务上云的经典架构设计,涵盖用户业务现状及挑战、阿里云业务托管架构设计、方案选型配置及业务初期低门槛使用等内容。通过详细分析现有架构的问题,提出了高可用、安全、可扩展的解决方案,并提供了按量付费的低成本选项,帮助企业在业务初期顺利上云。
|
21天前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
27 0