前言
在我上一篇讲Retrofit+RxJava在MVP模式中优雅地处理异常(一)中,发现很多网友发邮箱给我表示期待我的下一篇文章,正好趁着清明假期,我就写写平时我在使用RxJava+Retrofit怎么去灵活地处理一些场景。比如说一些比较常见的场景:
- 网络请求过程中token的处理
- 网络请求数据的加密与解密
- 为每个请求添加固定的头部,比如说当前版本号,Rsa的密钥等等
- 规范化每个网络请求,让代码只写一次
我自己平时对代码的简洁性要求非常高,所以retrofit+rxjava正好切中了我的痛点,这也是激发我写这篇文章的原因,我想要与大家一起交流进步,可以看看我的代码示例
一个简单的示例
(可以选择先忽略,等看完这篇文章再回头来看)
/**
* @author whaoming
* github:https://github.com/whaoming
* created at 2017/2/14 15:59
* Description:数据请求的管理类
*/
public class HttpMethods {
//retrofit对应的接口
private ApiService myService;
//构造方法私有
private HttpMethods() {
List<Interceptor> interceptors = new ArrayList<>();
Map<String,String> headers = new HashMap<>();
headers.put("userid",25);
TokenGetInterceptor tokenGetInterceptor = new TokenGetInterceptor(headers);
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
AESInterceptor aesInterceptor = new AESInterceptor();
//创建一个http头部处理器拦截器(这里主要处理服务器返回token的捕获)
interceptors.add(tokenGetInterceptor );
//日志打印拦截器
interceptors.add(loggingInterceptor );
//数据的加密与解密拦截器
interceptors.add(aesInterceptor);
RetrofitHelper.getInstance().init(ConstantValue.SERVER_URL,interceptors );
//创建service
myService = RetrofitHelper.getInstance().createService(ApiService.class);
}
//根据id用户一个用户的信息
public Observable<UserCommonInfo> getUserInfoById(int userid){
return Direct2.create(myService.getUserInfoById(userid),new TokenProviderImpl());
}
}
/**
* Created by Mr.W on 2017/2/14.
* E-maiil:122627018@qq.com
* github:https://github.com/whaoming
* TODO: 按照创建者模式的思想,把一个访问服务器的操作规格化
*/
public class Direct {
public static<T> Observable<T> create(Observable<Result<T>> resurce,TokenProvider tokenProvider){
return resurce
//解析固定格式json
.map(new ResultParseInterceptor<T>())
//处理token过期,tokenProvider为当发现token过期时候具体的处理方式
.retryWhen(new TokenExpireInterceptor(tokenProvider))
//捕获整个请求过程中的错误
.onErrorResumeNext(new ErrorInterceptor<T>())
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io());
}
}
网络层:RxJava+Retrofit
相对来说,retrofit+rxjava的学习成本还是比较高的。举个例子,就拿数据打印来说,如果使用okHttp的话,可以直接在回调里面打印服务器返回的json数据,但是放在retrofit中,因为retrofit会自动帮你封装成对应的bean,这使得数据解析这个过程不可见,需要通过retrofit的拦截器才能实现,所以拦截器对于retrofit来说,是一个非常非常重要的东西。
retrofit拦截器的使用场景
日志拦截器
还记得刚开始使用retrofit的时候,就被这个功能吓到了,大哥我只是想简单地打印下服务器给了我什么数据,为什么要这么麻烦啊!!!不过后面也越来越理解retrofit这样做的原因了,(个人愚见)这样使得所有的操作都规范化,用我自己的话说,就是retrofit告诉你,只要你想要”入侵”数据发送和解析的过程,不论是什么操作,你就得给我使用拦截器。那么其实说难也不难,只是几行