我的令牌将过期,因此我希望在令牌过期时使用retryWhen操作符自动获取令牌,在一个简单的类中刷新令牌,然后重试请求。但此时出现了一个问题,我得到了令牌,但是当我重新发起请求时,请求中的令牌是空的,但我确认我得到了令牌。
NetService
@GET("/meeting/api/v2.0/schedules")
fun getMySchedule(@Query("start_time") startTime: Long,
@Query("end_time") endTime: Long,
@Query("type") type: Int,
@Header("cookie") cookie: String = "ssoid=${MeetingTokenManager.accessToken}")
: Observable<BaseData<List<MyScheduleResponse>>>
令牌单例
object MeetingTokenManager {
var accessToken: String = ""
}
TokenRefreshFun
class TokenRefreshFun(private val baseView: IBaseView) : Function<Observable<Throwable>, ObservableSource<*>> {
var count = 0
override fun apply(t: Observable<Throwable>): ObservableSource<*> = t.flatMap {
if (it is NetExceptionHandler.ResponseException) {
if (it.code == 401) {
logi("token验证失败.开始刷新token")
if (count == 0) {
count++
baseView.tokenExpired()
} else {
Observable.error(it)
}
} else {
Observable.error(it)
}
} else {
Observable.error(it)
}
}}
请求函数
fun getMySchedule(startTime: Long,
endTime: Long,
type: Int = 1) {
mScheduleBiz.getMySchedule(startTime, endTime, type)
.compose(RxHelper.singleModeThread(iBaseView = mMyScheduleView))
.retryWhen(TokenRefreshFun(mMyScheduleView))
.subscribe(KNetObserver({
mDisposables.add(it)
}, {
when (it.status) {
1 -> mMyScheduleView.getMyScheduleSuccess(it.data)
0 -> mMyScheduleView.getMyScheduleFailed("获取日程失败")
}
}, {
mMyScheduleView.getMyScheduleFailed(it.message)
}))
}
baseView.tokenExpired()
fun authorization(context: Context): Observable<String> {
return Observable.create<String> { e ->
AuthorizationManager.authorization(context, CLIENT_ID, { token ->
accessToken = token
logi(accessToken)
JTUInfoSDK.getInstance().setCookie(token)
LoginMyInfo.accessToken = token
e.onNext(token)
}, {
e.onError(Throwable(it))
})
}
}
发布于 2018-08-10 04:04:01
你说你收到了令牌。我假设您的意思是,您的日志记录语句显示您收到了令牌。
但是,我注意到accessToken
被分配了令牌的值,因此我假定您的网络访问代码使用了它。这个值是什么时候绑定的?我将猜测getMySchedule()
绑定了标记的先前值,并且永远不会重新计算它。
您必须重新构造代码,以便在出现错误时重新绑定Cookie值。
https://stackoverflow.com/questions/51762924
复制相似问题