文档章节

Android客户端应用享用传统Web服务

secondriver
 secondriver
发布于 2015/09/17 09:27
字数 1117
阅读 14
收藏 0

      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
粉丝 10
博文 229
码字总数 233821
作品 0
广州
程序员
私信 提问
加载中

评论(1)

草社区榴最新地址1024
草社区榴最新地址1024
原来如此
PhoneGap是什么?

PhoneGap是目前唯一支持7种平台的开源移动开发框架,支持的平台包括iOS、Android、BlackBerry OS、Palm WebOS、Windows Phone 7、Symbian和Bada,如图1-2所示。 PhoneGap是一个基于HTML、CSS...

生气的散人
2012/11/21
1K
5
为 Android 开发访问 JAX-RS Web 服务的 Apache HttpClient 客户端

简介: 使用 Apache HttpClient 库访问 JAX-RS web 服务。Jersey 是 JAX-RS 的参考实现,它简化了 Java™ 环境下的 RESTful Web 服务的开发。Android 是一款流行的智能手机,本文将展示如何为...

IBMdW
2011/11/07
2.3K
3
为 JAX-RS web 服务开发 Spring Android 客户端

具象状态传输 (Representational State Transfer,REST)软件体系结构基于资源表示的传输。RESTful web 服务是一种基于 REST 和 HTTP 协议的 web 服务,并被作为一个 URI 路径可用。此 web ...

IBMdW
2011/09/28
3.1K
1
Android Web App 简介

Web Apps Overview 译者署名: happyjiahan 审核:铁骑_PuLee 版本:Android 3.2 r1 在android上发布一个应用程序一般有两种方式:一种是基于客户端模式(Client-Side模式)的应用程序(基于客...

阿酷
2011/11/17
10.1K
1
Chrome OS和Android的三大不同点

Chrome OS和Android的三大不同点 发表于:2010-12-5 12月7日,谷歌有望宣布一个载有第一版Chrome操作系统的便携电脑发行。与此同时,Google正带着Android大力前行。Google真的需要两个操作系...

xyxzfj
2010/12/06
2.7K
8

没有更多内容

加载失败,请刷新页面

加载更多

android 事件分发

记录下对Android事件分发的理解: 如果a作为viewgroup,b作为view,b包含在a中。事件会先传递到viewgroup中,既a。然后a会进行事件分发给子view。事件分发的方法中,会有个判断,是否要分发给...

醉雨
15分钟前
0
0
今天的学习

今天学到了 get和post传参: Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示 Post传输的数据量大,理论上是无限大,而Get方法由于受到URL长度的限制,只能传递大约1024字节 ...

墨冥
21分钟前
0
0
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

public class Solution { private ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>(); ArrayList<ArrayList<Integer>> all= new ArrayList<ArrayList<Integer>>......

南桥北木
23分钟前
0
0
使用lombok编写优雅的Bean对象

使用java编写代码,十之八九都是在写java类,从而构建java对象。lombok之前也说了不少,但使用了这么多年,感觉还是有很多技巧可以使用的。 毫无疑问,使用lombok,编写的java代码很优雅,而...

polly
23分钟前
0
0
表现与数据分离、web语义化的理解

表现与数据分离 什么是表现与数据分离? “分离”说的是两方面: 第一方面是前端与后台分离,所有数据都是后台通过AJAX发送给前端,前端处理数据展现页面,不需要后台在页面中插入变量。 第二...

祖达
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部