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 / AlamofireObjectMapper - 如何从 responseObject 打印错误 json?