Alamofire 重试不适用于 validate()
Alamofire retry doesn't work with validate()
我开始研究 Swift 和 Alamofire。但是我 运行 遇到 RequestInterceptor 的问题:重试函数不起作用。
我的请求拦截器:
class MyRequestInterceptor: RequestInterceptor {
// MARK: - ADAPT
func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
print("-------ADAPT---------")
var request = urlRequest
guard let token = TokenService.getAccess() else {
return
}
let bearerToken = "Bearer \(token)"
request.setValue(bearerToken, forHTTPHeaderField: "Authorization")
completion(.success(request))
}
// MARK: - RETRY
func retry(_ request: Request, for session: Session, dueTo error: ApiError, completion: @escaping (RetryResult) -> Void) {
print("--------RETRY-------")
guard let refresh = TokenService.getRefresh() else {
completion(.doNotRetry)
return
}
let parameter = Refresh(token: refresh)
AF.request(ApiManager.refresh.path, method: .post, parameters: parameter)
.responseDecodable(of: TokensPair.self) { response in
guard let tokens = response.value else {
completion(.doNotRetry)
return
}
TokenService.setAccess(token: tokens.access)
TokenService.setRefresh(token: tokens.refresh)
completion(.retry)
}
}
}
我的会话管理器:
class SessionManager {
static let shared = SessionManager()
let sessionManager: Session = {
let configuration = URLSessionConfiguration.af.default
configuration.timeoutIntervalForRequest = 30
configuration.waitsForConnectivity = true
return Session(
configuration: configuration,
interceptor: MyRequestInterceptor()
)
}()
}
我的要求:
func checkUser(complition: @escaping (Result<User, ApiError>) -> Void) {
SessionManager.shared.sessionManager.request(ApiManager.me.path).validate().responseDecodable(of: User.self) {
response in
guard let user = response.value else {
complition(.failure(.invalidCred))
return
}
complition(.success(user))
}
}
Adapt 正常工作。但重试永远行不通。我究竟做错了什么?
我正在使用 validate()
并期望状态代码:401 导致导致重试的错误,但它不起作用。
我认为重试实施中存在问题。因为当我尝试替换
class MyRequestInterceptor: RequestInterceptor
至
class MyRequestInterceptor: RequestRetrier, RequestAdapter
我收到错误:
Type 'MyRequestInterceptor' does not conform to protocol 'RequestRetrier'
但我不知道为什么。而且我没有找到解决方案。
我使用:
Xcode 13.2.1,
Swift: 5,
阿拉莫菲尔:5.4.4.
谢谢!
您在 retry
方法签名中使用了 ApiError
,这违反了一致性。它与 RequestInterceptor
一起使用,因为该类型提供了默认实现。匹配正确的签名,确保没有本地类型隐藏签名中的类型,它应该可以正常工作。
我开始研究 Swift 和 Alamofire。但是我 运行 遇到 RequestInterceptor 的问题:重试函数不起作用。 我的请求拦截器:
class MyRequestInterceptor: RequestInterceptor {
// MARK: - ADAPT
func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
print("-------ADAPT---------")
var request = urlRequest
guard let token = TokenService.getAccess() else {
return
}
let bearerToken = "Bearer \(token)"
request.setValue(bearerToken, forHTTPHeaderField: "Authorization")
completion(.success(request))
}
// MARK: - RETRY
func retry(_ request: Request, for session: Session, dueTo error: ApiError, completion: @escaping (RetryResult) -> Void) {
print("--------RETRY-------")
guard let refresh = TokenService.getRefresh() else {
completion(.doNotRetry)
return
}
let parameter = Refresh(token: refresh)
AF.request(ApiManager.refresh.path, method: .post, parameters: parameter)
.responseDecodable(of: TokensPair.self) { response in
guard let tokens = response.value else {
completion(.doNotRetry)
return
}
TokenService.setAccess(token: tokens.access)
TokenService.setRefresh(token: tokens.refresh)
completion(.retry)
}
}
}
我的会话管理器:
class SessionManager {
static let shared = SessionManager()
let sessionManager: Session = {
let configuration = URLSessionConfiguration.af.default
configuration.timeoutIntervalForRequest = 30
configuration.waitsForConnectivity = true
return Session(
configuration: configuration,
interceptor: MyRequestInterceptor()
)
}()
}
我的要求:
func checkUser(complition: @escaping (Result<User, ApiError>) -> Void) {
SessionManager.shared.sessionManager.request(ApiManager.me.path).validate().responseDecodable(of: User.self) {
response in
guard let user = response.value else {
complition(.failure(.invalidCred))
return
}
complition(.success(user))
}
}
Adapt 正常工作。但重试永远行不通。我究竟做错了什么?
我正在使用 validate()
并期望状态代码:401 导致导致重试的错误,但它不起作用。
我认为重试实施中存在问题。因为当我尝试替换
class MyRequestInterceptor: RequestInterceptor
至
class MyRequestInterceptor: RequestRetrier, RequestAdapter
我收到错误:
Type 'MyRequestInterceptor' does not conform to protocol 'RequestRetrier'
但我不知道为什么。而且我没有找到解决方案。
我使用: Xcode 13.2.1, Swift: 5, 阿拉莫菲尔:5.4.4.
谢谢!
您在 retry
方法签名中使用了 ApiError
,这违反了一致性。它与 RequestInterceptor
一起使用,因为该类型提供了默认实现。匹配正确的签名,确保没有本地类型隐藏签名中的类型,它应该可以正常工作。