Rxjava2+Retrofit2优雅实现token验证失败重新获取token然后重新请求该接口
公司的接口请求都需要token验证,但是获取的token有过期时间,所以需要一个机制来保证token过期之后重新获取,并且继续接口请求。那么既然每个接口都需要验证token是否过期,如果过期就重新获取。之前未使用rxjava和retrofit,所以在本地保存一个过期时间,到了时间请求一个接口时就在父类中先重新获取token,然后请求接口。如今使用了rxjava和retrofit,网络请求倒是解耦清爽,但是token获取成了一个难题,翻阅了很多rxjava的操作符,终于有了一个方案。
1.利用请求接口失败的错误码来判断token是否过期。
2. 如果过期了,就重新获取token,存储
3. 利用新的token重新请求该接口
这里利用了rxjava的几个操作符:
defer:只有在订阅时才会创建observable,解决重新利用新的token生成请求的observable
flatMap:可以把observable转换,返回一个新的observable,这里利用来进行返回结果的判断,是否是token过期,若过期,执行return Observable.error(newApiError(5)); 让retryWhen方法执行
retryWhen:当返回error是执行的方法,表示重试,会重新进行事件发布,而前面的defer包裹的observable会被重新创建。所以相当于重新创建一个observable并且发布。retryWhen需要一个notificationhandler处理是否要重新发布,这里我也自定义了一个类RetryWithNewToken来处理
presenter中的请求接口代码
retryWhen的handler类
我们在RetryWithNewToken处理token失效时,重新请求token并存储,都在io线程。
至此,结合mvp,rx.java2 retrofit2的token失效获取机制封装完成。在此记录。