retrofit+okhttp+rxjava處理ouanth2 token過期時(shí)堡纬,請(qǐng)求刷新token并重新請(qǐng)求原接口。
這種方法只適用于http code返回錯(cuò)誤的情況,如果是業(yè)務(wù)內(nèi)code返回則需要用okhttp攔截來實(shí)現(xiàn)。
關(guān)鍵操作符為retryWhen沃于,在錯(cuò)誤時(shí)重新請(qǐng)求。
Observable.just(null)
.flatMap(new Func1<Object, Observable<T>>() {
@Override
public Observable<T> call(Object o) {
return RetrofitService.getInstance().createApi(UserApi.class).getPersonInfo();//請(qǐng)求的接口海诲,例:獲取用戶信息
}
})
.retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() {
@Override
public Observable<?> call(Observable<? extends Throwable> observable) {
return observable
.flatMap(new Func1<Throwable, Observable<?>>() {
@Override
public Observable<?> call(Throwable throwable) {
if (throwable instanceof HttpException && ((HttpException) throwable).code() == 401) { //返回401,token過期
return RetrofitService.getInstance().createApi(OauthApi.class).refreshToken(refreshToken)//刷新token請(qǐng)求
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io()) //同步
.doOnNext(new Action1<TokenResult>() {
@Override
public void call(TokenResult tokenResult) {
//獲取新的token并保存
//TokenBean tokenBean = tokenResult.data;
//saveToken(tokenBean);
}
});
}
return Observable.error(throwable);
}
});
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(UseCaseSubscriber); //傳入業(yè)務(wù)的subscriber