我在如何使用 moya 和 rxswift 刷新 oauth 令牌上找到了这个示例,我必须稍作改动才能编译。此代码适用于我的场景 80%。它的问题是它将针对所有 http 错误运行,而不仅仅是 401 错误。我想要的是让我所有的其他 http 错误作为错误传递,这样我就可以在其他地方处理它们,而不是在这里吞下它们。
使用此代码,如果我得到 a HttpStatus 500
,它将运行身份验证代码 3 次,这显然不是我想要的。
我试图更改此代码以仅处理401
错误,但似乎无论我做什么我都无法编译代码。它总是抱怨错误的返回类型,"Cannot convert return expression of type Observable<Response> to return type Observable<Response>"
这对我来说毫无意义..
我想要什么:处理 401,但在所有其他错误上停止
import RxSwift
import KeychainAccess
import Moya
public extension ObservableType where E == Response {
/// Tries to refresh auth token on 401 errors and retry the request.
/// If the refresh fails, the signal errors.
public func retryWithAuthIfNeeded() -> Observable<E> {
return self.retryWhen {
(e: Observable<ErrorType>) in
return Observable.zip(e, Observable.range(start: 1, count: 3), resultSelector: { $1 })
.flatMap { i in
return AuthProvider.sharedInstance.request(
.LoginFacebookUser(
accessToken: AuthenticationManager.defaultInstance().getLoginTokenFromKeyChain(),
useFaceBookLogin: AuthenticationManager.defaultInstance().isFacebookLogin())
)
.filterSuccessfulStatusCodes()
.mapObject(Accesstoken.self)
.catchError {
error in
log.debug("ReAuth error: \(error)")
if case Error.StatusCode(let response) = error {
if response.statusCode == 401 {
// Force logout after failed attempt
log.debug("401:, force user logout")
NSNotificationCenter.defaultCenter().postNotificationName(Constants.Notifications.userNotAuthenticated, object: nil, userInfo: nil)
}
}
return Observable.error(error)
}.flatMapLatest({
token -> Observable<Accesstoken> in
AuthenticationManager.defaultInstance().storeServiceTokenInKeychain(token)
return Observable.just(token)
})
}
}
}
}