使用Spring for Android获取网络数据

本文介绍了如何在Android应用中利用Spring for Android的RestTemplate简化REST API的使用,包括添加依赖、创建RestTemplate、设置响应头、添加数据转换器以及执行HTTP请求获取JSON数据的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

执行结果

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值