zoukankan      html  css  js  c++  java
  • [Android]使用Spring for Android改善数据交互流程

      如果开发一个和服务端有数据交互android应用,流程通常是这样的:界面收集用户数据之后,将它转换成JSON或者XML格式的字符串,以HTTP的方式提交给服务端,获得返回的文本数据,再将数据解析为java对象,参看这位朋友的博文《android通过httpClient请求获取JSON数据并且解析》。对于复杂的应用,JSON数据的字段会很多,那数据解析的那段代码就会很长。能不能封装这个流程,让开发人员只关注业务逻辑呢?用Spring For Android可以做到这一点。
      Spring For Android是Spring框架的一个扩展,主要目的在简化Android本地应用的开发。 官方网址:http://www.springsource.org/spring-android

      1 使用RestTemplate来为你的Android客户端提供REST服务

      2 提供了跟其它诸如Twitter和Facebook等社交网络的集成与OAuth授权客户端等等

      本文章讨论的是RestTemplate的使用,第二项功能就不介绍了。

         下面以用户登录的例子,给大家介绍spring for android如何使用:

    1  引入必须的JAR

     

    jaskson-core和jackson-mappper用来解析和自动映射json数据,在官方网址可以下载到

    2  先看android客户端代码

    LoginMessage message = new LoginMessage(username,password);
    MemberMessage responseMessage =RestTemplateManager.postJSON(Urls.LOGIN_URL, message, MemberMessage.class);
    

    LoginMessage是一个普通的Java bean, 它包含了一个登录所需的用户名(loginName)和密码(passsword),MemberMessage 也是一个普通的Java bean,l里面包含了用户基本信息.RestTemplateManager.postJSON()会将LoginMessage对象自动转化为json格式的数据,并以https post方式送出,再将服务端返回的结果转化为MemberMessage对象.

    让我们在看看RestTemplateManager的代码(注意红色字体部分)

    public class RestTemplateManager {
        private static final int CONNECT_TIMEOUT = 30000;// 30秒
        private static final int READ_TIMEOUT = 15000;// 15秒
        private static final String TAG = "RestTemplateManager";
        private static SimpleClientHttpRequestFactory simpleFactory;
        private static HttpComponentsClientHttpRequestFactory httpComponentsFactory;
        private static HttpHeaders httpHeaders = new HttpHeaders();
        static {
            simpleFactory = new SimpleClientHttpRequestFactory();
            simpleFactory.setConnectTimeout(CONNECT_TIMEOUT);
            simpleFactory.setReadTimeout(READ_TIMEOUT);
    
            httpComponentsFactory = new HttpComponentsClientHttpRequestFactory();
            httpComponentsFactory.setConnectTimeout(CONNECT_TIMEOUT);
            httpComponentsFactory.setReadTimeout(READ_TIMEOUT);
        }
    
        /**
         * 请求头里面加入验证字符串
         * 
         * @param extra
         */
        public static void setHttpHeaders(String extra) {
            httpHeaders.add("verify", extra);
        }
    
        public static ClientHttpRequestFactory getResquestFactory() {
            // 当SDK版本号为大于2.3时
            if (Build.VERSION.SDK_INT >= 9) {
                return simpleFactory;
            }
            return httpComponentsFactory;
        }
    
        /**
         * POST请求
         * 
         * @param url
         * @param msg
         * @param clazz
         * @return
         */
        public static <R, M> R postJSON(String url, M msg, Class<R> clazz) {
            try {
                Log.v(TAG, url);
                httpHeaders.setContentType(MediaType.APPLICATION_JSON);
                HttpEntity<M> requestEntity = new HttpEntity<M>(msg, httpHeaders);
                RestTemplate restTemplate = new RestTemplate(getResquestFactory());
                ResponseEntity<R> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, clazz);
                return response.getBody();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static <R> R getJSON(String url, Class<R> clazz, Object... uriVariables) {
            try {
                url = spliceRestURL(url, uriVariables);
                Log.v(TAG, url);
                HttpEntity<?> requestEntity = new HttpEntity<Object>(httpHeaders);
                RestTemplate restTemplate = new RestTemplate(getResquestFactory());
                ResponseEntity<R> responseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, clazz,
                        uriVariables);
                return responseEntity.getBody();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 拼接rest风格的URL,注意参数的顺序
         */
        public static String spliceRestURL(String prefix, Object... params) {
            StringBuilder builder = new StringBuilder(prefix);
            for (Object p : params) {
                builder.append("/").append(p);
            }
            return builder.toString();
        }
    
    }

    postJSON和getJSON方法封装了http请求和JSON数据解析,开发人员只要定义合适的数据对象和处理好业务流程即可。

     3 服务端的代码(springMVC演示)

        @RequestMapping(value = "login", method = RequestMethod.POST, produces = "application/json")
        @ResponseBody
        public MemberMessage login(@RequestBody LoginMessage message) {
            MemberMessage result = new MemberMessage();
            //登录过程处理.......
    return result; }

    springmvc收到LoginMessage对象处理了登录流程之后,再将结果对象MemberMessage转化为JSON数据

    MemberMessage和LoginMessage两个对象在服务端和客户端是重用的,如果你的服务端是Java项目,使用这个组件就更便利了。

    这个框架已经用在了公司的客户端上,几乎所有的数据请求都用它。

  • 相关阅读:
    【移动安全基础篇】——30、class.dex文件格式讲解
    【移动安全基础篇】——29、Android源码定制添加反反调试机制
    【移动安全基础篇】——28、Apk加固
    【移动安全基础篇】——27、常用调试检测方法与过检测方法
    【移动安全基础篇】——26、两个简单app破解
    粒子特效优化
    android studio生成aar包
    AndroidManifest
    声音
    unity webview
  • 原文地址:https://www.cnblogs.com/xiaoyangjia/p/2646499.html
Copyright © 2011-2022 走看看