使用Spring for Android获取网络数据

来源:互联网 发布:画设备流程图软件 编辑:程序博客网 时间:2024/05/16 06:16

Spring for Android介绍

如果想要在我们的Android应用中使用某个REST API,我们需要在UI里搜集用户的输入,并将其转换为API可以接受的格式,然后以HTTP的方式提交给服务端,对于获得的字符串响应,需要自行解析并获得需要的信息。我们发现中途很多步骤都是重复的,spring for android可以为我们简化这些重复的步骤而让开发人员更关注与app相关的核心业务逻辑。

Spring For Android是Spring框架的一个扩展,主要目的在简化Android本地应用的开发。
主要提供了两个方面的功能:

  1. 使用RestTemplate来为你的Android客户端提供REST服务
  2. 提供了跟其它诸如Twitter和Facebook等社交网络的集成与OAuth授权客户端等等

本文主要使用第一个功能来进行网络数据获取的简化。

下面我们以一个REST API的加载实例来展示spring for android的作用。

API介绍

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<GroupInfo[]> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, GroupInfo[].class);GroupInfo[] result = responseEntity.getBody();

以下为AsyncTask的全部内容

private class MyTask extends AsyncTask<Void, Void, GroupInfo> {    @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<GroupInfo[]> 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());    }}

执行结果

这里写图片描述