若是開發一個和服務端有數據交互android應用,流程一般是這樣的:界面收集用戶數據以後,將它轉換成JSON或者XML格式的字符串,以HTTP的方式提交給服務端,得到返回的文本數據,再將數據解析爲java對象,參看這位朋友的博文《android經過httpClient請求獲取JSON數據而且解析》。對於複雜的應用,JSON數據的字段會不少,那數據解析的那段代碼就會很長。能不能封裝這個流程,讓開發人員只關注業務邏輯呢?用Spring For Android能夠作到這一點。
Spring For Android是Spring框架的一個擴展,主要目的在簡化Android本地應用的開發。 官方網址:http://www.springsource.org/spring-androidhtml
1 使用RestTemplate來爲你的Android客戶端提供REST服務java
2 提供了跟其它諸如Twitter和Facebook等社交網絡的集成與OAuth受權客戶端等等android
本文章討論的是RestTemplate的使用,第二項功能就不介紹了。spring
下面以用戶登陸的例子,給你們介紹spring for android如何使用:json
1 引入必須的JAR網絡
jaskson-core和jackson-mappper用來解析和自動映射json數據,在官方網址能夠下載到
mvc
2 先看android客戶端代碼app
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的代碼(注意紅色字體部分)post
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項目,使用這個組件就更便利了。
這個框架已經用在了公司的客戶端上,幾乎全部的數據請求都用它。