统一的报文格式 一般公司开发都是会设计请求报文,报文结构一般是统一的,例如下面这样的格式 - {
- "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<List<String>>
复制代码
格式的泛型结构自动脱去一层? 最简单的方法就是我们继承Func1类,重载里面的call方法,自动化脱掉一层泛型。
代码如下
- 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 均可以使用!
|