Alamofire+Combine:如何从 AFError 中获取自定义错误类型

Posted

技术标签:

【中文标题】Alamofire+Combine:如何从 AFError 中获取自定义错误类型【英文标题】:Alamofire+Combine: how to get custom error type out of AFError 【发布时间】:2020-09-09 06:47:26 【问题描述】:

我正在使用 Alamofire 及其组合助手来执行简单的网络请求,如下所示:

class AlamofireClient 
    func getData<T: Decodable>(request: URLRequestConvertible) -> AnyPublisher<T, APIError> 
         AF.request(request)
            .validate()
            .publishDecodable(type: T.self)
            .value()
            .mapError(APIError.init(error:))
            .eraseToAnyPublisher()
    


enum APIError: Error 
    init(error: AFError) 
        self = .network
    
    
    case network
    case custom(Int, String, String)
    
    var message: String 
        switch self 
        case .network:
            return "Network Error"
        case .custom(let code, let message, let technicalMessage):
            return "Custom error info are: \(code) -- \(message) -- \(technicalMessage)"
        
    

我一直在提取从服务器返回的自定义错误信息,在我的例子中,它有 3 项:代码、消息和技术消息。

【问题讨论】:

“卡住”是什么意思?究竟是什么问题? 执行请求得到什么响应?我的猜测是您的服务器返回的状态代码超出了 Alamofire 中的默认验证。您可以在 Alamofire 中为请求设置可接受的状态代码。 ¿您找到解决方案了吗?我也“卡”在相同的代码上。 @Andreybeta 我最终删除了 Alamofire 并使用了比 Alamofire 更灵活的 URLSession 【参考方案1】:

所以我曾经历过类似的情况,我想传递自己的错误,而不是 Alamofire。请参阅我使用的以下代码实现,它对我有用。希望它也会对某些人有所帮助。

 public func request<T>(response: @escaping (AnyPublisher<T, MyNetworkError>) -> ()) where T : Decodable 
        response(
        MyNetwork.shared.sendRequest(path: “sample/url/endpoints”)
            .validate()
            .publishDecodable(type: T.self)
            .value()
            .mapErrorMyNetworkError.networkError(error: ($0 as Error))
            .eraseToAnyPublisher())
    

虽然我自己的错误如下所示。

public enum MyNetworkError: Error 
    case networkError(error: Error)

【讨论】:

以上是关于Alamofire+Combine:如何从 AFError 中获取自定义错误类型的主要内容,如果未能解决你的问题,请参考以下文章

我如何从 AlamoFire 退货?

Alamofire / AlamofireObjectMapper - 如何从 responseObject 打印错误 json?

如何从 Alamofire 错误中获取潜在错误?

Alamofire - 如何从 AFError 获取 API 错误

如何从 Alamofire 返回值

如何从 alamofire 中的 json 数组中获取对象?