RxJava Retrofit2 网络请求,返回数据格式统一的数据报文处理方法
2016-08-15 13:48
706 查看
转载自:该文 感谢!
统一的报文格式
data 有可能是JsonArray 也有可能是JsonObject。demo如下:
JsonArray
JsonObject
那么使用Json序列化工具的时候,数据格式就会发生一定的变形。
DataResponse.java
当data为JsonObject时Observable的泛型如下
当data为JsonArray时Observable的泛型如下
这样泛型很多层,获取数据更是一个体力活。我们的报文既然是固定格式的,那么可不可以在处理的时候自动化?
答案是可行的!
使用map操作符,转换数据流
此文使用到了RxJava中的map操作符,此处不赘述,不清楚的童鞋点击这里
rain 大神的 RxJava 教程 http://blog.chengyunfeng.com/?p=964
写的超级细致!赞!
map操作符是可以转换数据流的操作符,那么我们是不是可以将DataResponse或DataResponse
使用方法:
至此,即可简便的处理统一格式的数据报文。XML、Json 均可以使用!
统一的报文格式
一般公司开发都是会设计请求报文,报文结构一般是统一的,例如下面这样的格式
{ "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 均可以使用!
相关文章推荐
- RxJava Retrofit2 网络请求,返回数据格式统一的数据报文处理方法
- RxJava + Retrofit+okhttp 封装,包含对相同格式请求数据、相同格式返回数据处理,显示 Material Design 加载 dialog,文件上传下载进度展示、全局异常捕捉。
- Rxjava +Retrofit 你需要掌握的几个技巧,Retrofit缓存,RxJava封装,统一对有无网络处理,异常处理, 返回结果问题
- ajax发送请求后台处理数据格式然后返回前台的方法(ObjectMapper)
- RxJava结合Retrofit对网络请求结果的统一处理
- Rxjava +Retrofit 你需要掌握的几个技巧,Retrofit缓存,RxJava封装,统一对有无网络处理,异常处理, 返回结果问题
- Retrofit请求数据对错误以及网络异常的处理
- 数组和字典的writeToFile方法——在项目开发中处理网络数据的时候,可以把请求获得的网络数据保存为plist文件,这样更方便开发
- 封装http请求返回统一json格式数据的网络操作
- Retrofit请求数据对错误以及网络异常的处理
- JS 对java返回的json格式的数据处理方法
- iOS开发:过滤网络请求中,服务器返回空值null数据的处理(过滤null显示问题)
- ajax处理请求,以JSON数据格式返回,(json时间日期返回时对象---》日期格式)
- ios网络学习------6 json格式数据的请求处理
- ios网络学习------5 json格式数据的请求处理
- 使用MVP+Retrofit+RxJava实现的的Android Demo (下)使用Retrofit+RxJava处理网络请求
- 写给自己的网络请求解析 返回数组和字典类型不同的处理方法
- django通过ajax发起请求返回JSON格式数据的方法
- 【iOS解决方案】网络请求返回GB2312格式的xml数据转成UTF-8后为空(适用于论坛bbs)
- Android 使用RxJava+Retrofit +Realm 组合加载数据 <读取缓存 显示 请求网络数据 缓存最新数据 更新界面>(一)