使用Spring for Android获取网络数据

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 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());
    }
}

执行结果

使用Spring for Android获取网络数据_第1张图片

你可能感兴趣的:(Android)