前提:
auth
401-UNAUTHORIZED
,我们会调用auth
并重试该调用。它有效,但它不是很好我想以这样的方式更改它,我会在调用之前检查是否需要刷新令牌。
我希望通过链接Observable并在调用之间共享Auth-Observable来实现这一点
这样想:
答案 0 :(得分:3)
这方面的诀窍是使用Singleton Observable
Observable<AuthResponse> mAuthSingleton = retrofit.authenticate()
.doOnNext( response -> saveSessionToken(response.getSessionToken())
.share();
Observable<AuthResponse> getAuthCallWhenNecessary(){
if(sessionToken == null ||sessionToken.isAboutToExpire())
return mAuthSingleton;
else
return Observable.just(new AuthResponse());
}
Observable<WhateverResponse> getWhatever(){
return getAuthCallWhenNecessary().flatMap(response -> retrofit.getWhatever());
}
你的电话不关心他们在调用getAuthCallWhenNecessary
时获得的AuthResponse是否真实,他们只关心他们从Auth获得响应对象
这是我(有点)记录的工作样本:https://gist.github.com/TormundsMember/ebcb3782b14477a3d5b72e898929fe61
答案 1 :(得分:1)
答案 2 :(得分:0)
我在我的案例中所做的可能有点矫枉过正,但它确实有效 - 我用我自己的代理类包装了所有的Retrofit接口:
Proxy.newProxyInstance
Retrofit.Builder()
public Object invoke(Object proxy, Method method, Object[] args)
中调用实际的Retrofit实现,在此调用之前您可以检查令牌是否有效,如果没有,则刷新令牌并在{{中调用Retrofit方法实现1}} switchMap()
检查此错误,刷新访问令牌并再次调用Retrofit方法实现。resultObservable.retryWhen(errorCheck)
中,并且每当我的应用程序的一部分请求结果时(通过调用接口方法)都返回此主题,并且我只在单独的{时刷新网络中的结果已发出{1}}来电)