[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項目,使用這個組件就更便利了。

這個框架已經用在了公司的客戶端上,幾乎所有的數據請求都用它。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM