RxJava Retrofit2 网络请求,返回数据格式统一的数据报文处理方法

转载自:该文 感谢!

统一的报文格式

一般公司开发都是会设计请求报文,报文结构一般是统一的,例如下面这样的格式

{
 "code": "error",
 "msg": "错误信息",
 "data": "返回数据信息"
}

data 有可能是JsonArray 也有可能是JsonObject。demo如下:
JsonArray

{
 "code": "ok",
 "msg": "",
 "data": [
   "1923837918273.jpg",
   "1039488945879.jpg",
   "3981293879878.jpg",
   "5927378100293.jpg"
 ]
}

JsonObject

{
 "code": "ok",
 "msg": "",
 "data": {
   "fileName":"1923837918273.jpg"
 }
}

那么使用Json序列化工具的时候,数据格式就会发生一定的变形。
DataResponse.java

/**
 * <b>类名称:</b> DataResponse <br/>
 * <b>类描述:</b> 携带有数据的Http请求报文<br/>
 * <b>创建人:</b> Lincoln <br/>
 * <b>修改人:</b> Lincoln <br/>
 * <b>修改时间:</b> 2016年03月15日 下午5:19<br/>
 * <b>修改备注:</b> <br/>
 *
 * @version 1.0.0 <br/>
 */
public class DataResponse<T> {

    private String code;
    private String msg;
    private T data;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

当data为JsonObject时Observable的泛型如下

Observable<DataResponse<User>>

当data为JsonArray时Observable的泛型如下

Observable<DataResponse<List<String>>>

这样泛型很多层,获取数据更是一个体力活。我们的报文既然是固定格式的,那么可不可以在处理的时候自动化?

答案是可行的!
使用map操作符,转换数据流

此文使用到了RxJava中的map操作符,此处不赘述,不清楚的童鞋点击这里
rain 大神的 RxJava 教程 http://blog.chengyunfeng.com/?p=964
写的超级细致!赞!

map操作符是可以转换数据流的操作符,那么我们是不是可以将DataResponse或DataResponse

import rx.functions.Func1;

/**
 * <b>类名称:</b> ResponseFunc <br/>
 * <b>类描述:</b> 用于处理DataResponse数据格式的数据<br/>
 * <b>创建人:</b> Lincoln <br/>
 * <b>修改人:</b> Lincoln <br/>
 * <b>修改时间:</b> 2016年03月23日 下午4:04<br/>
 * <b>修改备注:</b> <br/>
 *
 * @version 1.0.0 <br/>
 */
public class ResponseFunc<T> implements Func1<DataResponse<T>, T> {

    private static final String RESP_OK = "ok";

    //此处逻辑根据约定报文进行修改,实现逻辑即可
    @Override
    public T call(DataResponse<T> httpResult) {
        if (!httpResult.getCode().equals(RESP_OK)) {
            // 在此处抛出异常,subscribe的onError方法中会收到异常。
            // 抛出的异常不能是会使系统崩溃的检查异常,如OOM
            throw new IllegalStateException(httpResult.getMsg());
        }
        return httpResult.getData();
    }
}

使用方法:

@Override
public void getConvenientBanner(final ServerView serverView) {
        ConvenientBannerModel model = new ConvenientBannerModelImpl();
        model.convenientBanner()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                //在此处调用一下,subscribe再处理的时候就脱掉了DataResponse
                .map(new ResponseFunc<List<String>>())
                .subscribe(new Action1<List<String>>() {
                    @Override
                    public void call(List<String> images) {
                        serverView.convenientBanner(images);
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        DebugLog.e("首页广告图获取失败," + throwable.getLocalizedMessage());
                    }
                });
    }

至此,即可简便的处理统一格式的数据报文。XML、Json 均可以使用!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值