自定义验证错误在AlamoFire 5中不再有效

编程入门 行业动态 更新时间:2024-10-12 18:17:57
本文介绍了自定义验证错误在AlamoFire 5中不再有效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

使用AlamoFire 4,我们有一个API响应验证器,我们按如下方式调用:

func request<Endpoint: APIEndpoint>(_ baseURL: URL, endpoint: Endpoint, completion: @escaping (_ object: Endpoint.ResponseType?, _ error: AFError?) -> Void) -> DataRequest where Endpoint.ResponseType: Codable { let responseSerializer = APIObjectResponseSerializer(endpoint) let request = self.request(baseURL, endpoint: endpoint) .validate(APIResponseValidator.validate) << VALIDATOR PASSED HERE .response(responseSerializer: responseSerializer) { response in completion(response.value, response.error) } return request }

如下所示:

static func validate(request: URLRequest?, response: HTTPURLResponse, data: Data?) -> Request.ValidationResult { // **INSERT OTHER FAILURE CHECKS HERE** // Verify server time is within a valid time window. let headers = response.allHeaderFields guard let serverTimeString = headers["Date"] as? String, let serverTime = DateUtils.headerDateFormatter().date(from: serverTimeString) else { Log.error("APIValidation: no Date in response header") return .failure(APIError.appTimeSettingInvalid)) } // **INSERT OTHER FAILURE CHECKS HERE** return .success(Void()) }

相应的错误将返回到请求完成处理程序

▿ APIError ▿ appTimeSettingInvalid

我们可以使用正确的错误更新UI,每个人都很高兴。

但现在有了Alamofire,它是这样的:

▿ Optional<Error> ▿ some : AFError ▿ requestRetryFailed : 2 elements ▿ retryError : AFError ▿ responseValidationFailed : 1 element ▿ reason : ResponseValidationFailureReason ▿ customValidationFailed : 1 element ▿ error : APIError ▿ appTimeSettingInvalid << Original custom error ▿ originalError : AFError ▿ responseValidationFailed : 1 element ▿ reason : ResponseValidationFailureReason ▿ customValidationFailed : 1 element ▿ error : APIError ▿ appTimeSettingInvalid << Original custom error

我需要这样访问:

if let underlyingError = (error as? AFError)?.underlyingError as? AFError, case let AFError.requestRetryFailed(_, originalError) = underlyingError, case let AFError.responseValidationFailed(reason) = originalError, case let .customValidationFailed(initialCustomError) = reason { showAlert(initialCustomError) }

这似乎很荒谬。我遗漏了什么?为什么自定义验证在方法没有任何变化的情况下失败,为什么它被包裹在一层其他错误中?当验证将以同样的方式失败时,为什么要重试请求?

如何跨所有请求一致地取回自定义错误?

推荐答案

在AlamoFire 5中,返回的所有错误都包含在AFError实例中,包括自定义验证错误。这允许我们的Response类型包含类型化错误,并提供一致的错误类型。然而,不幸的是,验证API仍然返回Error实例,因此需要再剥离一层。您可以使用便利性asAFError属性执行强制转换,使用underlyingError属性捕获任何底层错误。使用switch语句也可以简化提取。您还可以对响应mapError提取所需的特定错误类型。

至于重试,您的检索器可能尚未更新,无法以您的自定义错误类型正确避免重试的方式提取错误。

更多推荐

自定义验证错误在AlamoFire 5中不再有效

本文发布于:2023-11-26 20:33:54,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1635096.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:自定义   错误   AlamoFire

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!