如果想要在我们的Android应用中使用某个REST API,我们需要在UI里搜集用户的输入,并将其转换为API可以接受的格式,然后以HTTP的方式提交给服务端,对于获得的字符串响应,需要自行解析并获得需要的信息。我们发现中途很多步骤都是重复的,spring for android可以为我们简化这些重复的步骤而让开发人员更关注与app相关的核心业务逻辑。
Spring For Android是Spring框架的一个扩展,主要目的在简化Android本地应用的开发。
主要提供了两个方面的功能:
本文主要使用第一个功能来进行网络数据获取的简化。
下面我们以一个REST API的加载实例来展示spring for android的作用。
api的地址为http://115.29.184.56:8090/api/group,以get方式获取,但是需要设置对应的header来确认权限,这里需要以” liuqin 123”的Base64编码后的token,以”Basic”+空格+token后的值加入请求头”Authorization”。
返回的格式为
[
{
id:1,
name:"2013级1班"
}
]
首先需要添加spring for android的依赖
compile 'org.springframework.android:spring-android-rest-template:2.0.0.M3'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.5'
这里添加了jackson的依赖是为了解析对应的json文本。
注:构建时如果出现 duplicated files…错误,则需要在module 的build文件的android配置项中加入
packagingOptions { exclude 'META-INF/ASL2.0' exclude 'META-INF/LICENSE' exclude 'META-INF/license.txt' exclude 'META-INF/NOTICE' exclude 'META-INF/notice.txt' }
保证构建成功。
然后添加对应的Java Bean用来接收服务器的响应值’
public class GroupInfo {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
注:字段名字必须和api的返回值相同
我们这里采用AsyncTask来异步加载数据,然后在其中的doInBackground方法中进行数据的加载。以下我们不详细说明界面的更新流程,主要说明spring for android的使用方法。
Spring for Android提供的Rest客户端主要通过 RestTemplate 类来进行各种数据操作。
创建
RestTemplate可以直接通过其无参构造函数创建
RestTemplate restTemplate = new RestTemplate();
添加响应头
RestTemplate添加响应头需要自行创建HttpEntity
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add(headername, headerValue);
HttpEntity httpEntity = new HttpEntity(httpHeaders);
添加数据转换器
RestTemplate提供数据转换器,用于将原生的服务器响应转换为对用的JavaBean,其中API里内置了8种转换器,参见 RestTemplate。这里我们添加了Jackon的转换器用来转换json数据。
restTemplate.getMessageConverters().add(newMappingJackson2HttpMessageConverter());
获取响应
参数及设置完成后,我们可以通过restTemplate获取响应,这里使用exchange方法,通过对应的url、HTTP请求方法、请求参数、转换类型,来获取对应的响应,由于API返回的为一个数组,所以这里使用的为GroupInfo[].class。然后使用responseEntity.getBody()即可获取具体的响应内容。
ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, GroupInfo[].class);
GroupInfo[] result = responseEntity.getBody();
以下为AsyncTask的全部内容
private class MyTask extends AsyncTask {
@Override
protected GroupInfo doInBackground(Void... params) {
String url = "http://115.29.184.56:8090/api/group";
String key = getKey();
String headerValue = "Basic " + key;
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Authorization", headerValue);
HttpEntity httpEntity = new HttpEntity(httpHeaders);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod
.GET,
httpEntity, GroupInfo[].class);
return responseEntity.getBody()[0];
}
@Override
protected void onPostExecute(GroupInfo o) {
//update UI
}
private String getKey() {
return Base64Utils.encodeToString("liuqin:123".getBytes());
}
}