阿里云服务器免费领卷啦。

捡代码论坛-最全的游戏源码下载技术网站!

 找回密码
 立 即 注 册

QQ登录

只需一步,快速开始

搜索
关于源码区的附件失效或欺骗帖, 处理办法
查看: 2977|回复: 0

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

[复制链接]

4213

主题

210

回帖

12万

积分

管理员

管理员

Rank: 9Rank: 9Rank: 9

积分
127206
QQ
发表于 2017-5-11 12:35:46 | 显示全部楼层 |阅读模式
统一的报文格式

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

  1. {
  2. "code": "error",
  3. "msg": "错误信息",
  4. "data": "返回数据信息"
  5. }
复制代码


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

  1. {
  2. "code": "ok",
  3. "msg": "",
  4. "data": [
  5.    "1923837918273.jpg",
  6.    "1039488945879.jpg",
  7.    "3981293879878.jpg",
  8.    "5927378100293.jpg"
  9. ]
  10. }
复制代码


JsonObject

  1. {
  2. "code": "ok",
  3. "msg": "",
  4. "data": {
  5.    "fileName":"1923837918273.jpg"
  6. }
  7. }
复制代码


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


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

  12.     private String code;
  13.     private String msg;
  14.     private T data;

  15.     public String getCode() {
  16.         return code;
  17.     }

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

  21.     public String getMsg() {
  22.         return msg;
  23.     }

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

  27.     public T getData() {
  28.         return data;
  29.     }

  30.     public void setData(T data) {
  31.         this.data = data;
  32.     }
  33. }
复制代码
当data为JsonObject时Observable的泛型如下

  1. Observable<DataResponse<User>>
复制代码


当data为JsonArray时Observable的泛型如下

  1. Observable<DataResponse<List<String>>>
复制代码


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

答案是可行的!

使用map操作符,转换数据流

此文使用到了RxJava中的map操作符,此处不赘述,不清楚的童鞋点击这里
rain 大神的 RxJava 教程

  1. http://blog.chengyunfeng.com/?p=964
复制代码


写的超级细致!赞!

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

  1. DataResponse<User>
复制代码

  1. DataResponse<List<String>>
复制代码

格式的泛型结构自动脱去一层?

最简单的方法就是我们继承Func1类,重载里面的call方法,自动化脱掉一层泛型。
代码如下



  1. import rx.functions.Func1;

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

  13.     private static final String RESP_OK = "ok";

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


使用方法:
  1. @Override
  2. public void getConvenientBanner(final ServerView serverView) {
  3.         ConvenientBannerModel model = new ConvenientBannerModelImpl();
  4.         model.convenientBanner()
  5.                 .observeOn(AndroidSchedulers.mainThread())
  6.                 .subscribeOn(Schedulers.io())
  7.                 //在此处调用一下,subscribe再处理的时候就脱掉了DataResponse
  8.                 .map(new ResponseFunc<List<String>>())
  9.                 .subscribe(new Action1<List<String>>() {
  10.                     @Override
  11.                     public void call(List<String> images) {
  12.                         serverView.convenientBanner(images);
  13.                     }
  14.                 }, new Action1<Throwable>() {
  15.                     @Override
  16.                     public void call(Throwable throwable) {
  17.                         DebugLog.e("首页广告图获取失败," + throwable.getLocalizedMessage());
  18.                     }
  19.                 });
  20.     }
复制代码


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



捡代码论坛-最全的游戏源码下载技术网站! - 论坛版权郑重声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与捡代码论坛-最全的游戏源码下载技术网站!享有帖子相关版权
3、捡代码论坛版权,详细了解请点击。
4、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。
5、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。 我们不承担任何技术及版权问题,且不对任何资源负法律责任。
6、如无法链接失效或侵犯版权,请给我们来信:jiandaima@foxmail.com

回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立 即 注 册

本版积分规则

技术支持
在线咨询
QQ咨询
3351529868

QQ|手机版|小黑屋|捡代码论坛-专业源码分享下载 ( 陕ICP备15015195号-1|网站地图

GMT+8, 2025-1-22 22:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表