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应用)请求进行判断,获取不同类型的请求响应信息。
例如下面代码:
- packageorg.estao.servelet;
- importjava.io.IOException;
- importjava.io.PrintWriter;
- importjavax.servlet.ServletException;
- importjavax.servlet.http.HttpServlet;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpServletResponse;
- importorg.estao.business.ActionBusiness;
- importorg.estao.business.ActionManager;
- importorg.json.JSONException;
- importorg.json.JSONObject;
- publicclassSettingServletextendsHttpServlet{
- /**
- *
- */
- privatestaticfinallongserialVersionUID=-4384397961898281821L;
- privateActionBusinessactionBusiness;
- publicvoiddestroy(){
- super.destroy();
- }
- publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
- throwsServletException,IOException{
- response.setContentType("text/html");
- response.setCharacterEncoding("UTF-8");
- doPost(request,response);
- }
- publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
- throwsServletException,IOException{
- response.setContentType("text/html");
- response.setCharacterEncoding("UTF-8");
- PrintWriterout=response.getWriter();
- JSONObjectjsonObject=newJSONObject();
- booleanresult=actionBusiness.validSetting(jsonObject);
- try{
- jsonObject.put("Result",result);
- }catch(JSONExceptione){
- e.printStackTrace();
- }
- out.println(jsonObject.toString());
- out.flush();
- out.close();
- }
- publicvoidinit()throwsServletException{
- actionBusiness=ActionManager.getAppBusiness().getActionBusiness();
- }
- }
上面代码是获得JSON格式对象,作为响应信息。
2.在Android应用中以Http协议的方式访问服务器,使用Apache-httpclient开发包,或者进行适用于应用的再次封装。
例如下面代码:
- packageorg.estao.util;
- importjava.io.IOException;
- importjava.util.ArrayList;
- importjava.util.List;
- importjava.util.Map;
- importorg.apache.http.HttpResponse;
- importorg.apache.http.NameValuePair;
- importorg.apache.http.client.ClientProtocolException;
- importorg.apache.http.client.HttpClient;
- importorg.apache.http.client.entity.UrlEncodedFormEntity;
- importorg.apache.http.client.methods.HttpGet;
- importorg.apache.http.client.methods.HttpPost;
- importorg.apache.http.impl.client.DefaultHttpClient;
- importorg.apache.http.message.BasicNameValuePair;
- importorg.apache.http.util.EntityUtils;
- /**
- *
- *@authorAjax
- *
- *@messageJustForJSONObjectTransport
- *
- */
- publicclassHttpUtil{
- //创建HttpClient对象
- publicstaticfinalHttpClienthttpClient=newDefaultHttpClient();
- //访问Web服务器基础路径
- publicstaticfinalStringBASE_URL="http://10.43.10.108:8080/estao/";
- /**
- *GET方式无参数请求
- *
- *@param发送url请求
- *@return服务器相应的字符串
- *@throwsIOException
- */
- publicstaticStringgetRequest(Stringurl){
- HttpGetget=newHttpGet(url);
- HttpResponsehttpResponse=null;
- Stringresult=null;
- try{
- //发送GET请求
- httpResponse=httpClient.execute(get);
- //服务器端返回相应
- if(httpResponse.getStatusLine().getStatusCode()==200){
- //获取服务器相应的字符串
- result=EntityUtils.toString(httpResponse.getEntity());
- }
- }catch(ClientProtocolExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- returnresult;
- }
- /**
- *POST方式带参数请求
- *
- *@param发送url请求
- *@paramrawParams
- *@return服务器相应的字符串
- */
- publicstaticStringpostRequest(Stringurl,Map<String,String>rawParams){
- HttpPostpost=newHttpPost(url);
- HttpResponsehttpResponse=null;
- Stringresult=null;
- List<NameValuePair>params=newArrayList<NameValuePair>();
- for(Stringkey:rawParams.keySet()){
- //封装请求参数
- params.add(newBasicNameValuePair(key,rawParams.get(key)));
- }
- try{
- //设置请求参数
- post.setEntity(newUrlEncodedFormEntity(params,"GBK"));
- //发送POST请求
- httpResponse=httpClient.execute(post);
- //如果服务器成功的返回相应
- if(httpResponse.getStatusLine().getStatusCode()==200){
- //获取服务器响应的字符串
- result=EntityUtils.toString(httpResponse.getEntity());
- }
- }catch(ClientProtocolExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- returnresult;
- }
- }
3.开发Android应用程序,对JSON(或者其它格式数据交互对象)进行处理,获取需要的信息。
Android应用开发相对于已有的Web服务应用而言是独立的,可以将应用程序对服务器的请求和响应重新抽象一层,在已有的Web服务请求响应的控制层进行扩展和特定格式的数据信息封装。
本文出自 “野马红尘” 博客,谢绝转载!
更多相关文章
- Android架构组件简介
- 冰淇淋三明治 (Android(安卓)4.0)介绍
- Android自定义权限的使用
- Qt on Android:应用截屏
- 史上最全的Android开发学习教程集锦【初学者】
- Android线程与ANR
- Android与服务器端数据交互(http协议整合struts2+android)
- 谷歌Android手机应用开发环境的搭建 转载
- Android中的GPS应用开发入门教程