Alamofire 5.0.0-rc.3 RequestInterceptor Adapt 方法没有被调用 Alamofire 虽然在响应中有任何错误时会调用重试

Posted

技术标签:

【中文标题】Alamofire 5.0.0-rc.3 RequestInterceptor Adapt 方法没有被调用 Alamofire 虽然在响应中有任何错误时会调用重试【英文标题】:Alamofire 5.0.0-rc.3 RequestInterceptor Adapt method not being called of Alamofire although retry gets called when there is any error in response 【发布时间】:2019-11-14 08:59:41 【问题描述】:

方法:

    func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (AFResult<URLRequest>) -> Void) 

class Interceptor: RequestInterceptor 

      func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (AFResult<URLRequest>) -> Void) 
           print("ADAPT :=")
           completion(.success(urlRequest))
       

       func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) 
           print("RETRY :=")
           completion(.doNotRetry)

       

不同类的网络请求方法:

    public func request<T: Codable> (_ urlConvertible: URLRequestConvertible) -> Observable<T> 
        return Observable<T>.create  observer in

            // 1
            print("Url := \(urlConvertible.urlRequest!.url!)")

            // 2
            let request = AF.request(urlConvertible, interceptor: Interceptor()).responseDecodable  (response: AFDataResponse<T>) in

                if let data = response.data
                    print("Response := \(String(decoding: data, as: UTF8.self))")
                
                else
                    print("data is nil")
                

                switch response.result 
                case .success(let value):
                    print("value :-> \(value)")
                    observer.onNext(value)
                    observer.onCompleted()
                case .failure(let error):

                    observer.onError(error)
                
            

            //Finally, we return a disposable to stop the request
            return Disposables.create 
                request.cancel()
            
        

    

【问题讨论】:

【参考方案1】:

看这里:

https://github.com/Alamofire/Alamofire/issues/2998

函数没有被调用,因为存在歧义...

在拦截器中:

添加这个:

typealias AdapterResult = Swift.Result<URLRequest, Error>

并在“adapt”方法中将@escaping 参数替换为:

@escaping (RetryResult)

它应该可以工作。

【讨论】:

以上是关于Alamofire 5.0.0-rc.3 RequestInterceptor Adapt 方法没有被调用 Alamofire 虽然在响应中有任何错误时会调用重试的主要内容,如果未能解决你的问题,请参考以下文章

如何识别 JSON 响应中的特定值

将 json 数据转换为 [[String: AnyObject]] 后,它似乎是空的 - 为啥?

text requêteexpress1

sql Requêteimbriquée

Torch实现ReQU,和梯度验证

Swift 3 的 ObjectMapper 和 Alamofire 问题 Alamofire 4 的 Alamofire 版本