如何从 AFError 中确定具体的 409 错误?
Posted
技术标签:
【中文标题】如何从 AFError 中确定具体的 409 错误?【英文标题】:how to determine the specific 409 error from an AFError? 【发布时间】:2020-03-02 12:50:29 【问题描述】:我有一个方法可以返回 Single<(HTTPURLResponse, Any)>
调用网络服务。
此调用出于多种原因返回 409,并且此原因在响应中作为 JSON 传递。 我知道 JSON 在 DataResponse 对象的数据属性中,但我希望将它放在发生错误时传递的 AFError 中。我想向用户显示与 JSON 响应相关的特定 409 错误消息,以让他了解发生了什么。
我怎么能这样做?
我在 *** 和 Alamofire 的 github 上搜索过,但对我的案例没有任何帮助。
return Single<(HTTPURLResponse, Any)>.create(subscribe: single in
let request = self.sessionManager.request(completeURL, method: httpMethod, parameters: params, encoding: encoding, headers: headers)
request.validate().responseJSON(completionHandler: (response) in
let result = response.result
switch result
case let .success(value): single(.success((response.response!, value)))
case let .failure(error): single(.error(error))
)
return Disposables.create request.cancel()
)
我正在使用 Alamofire 4.9.1
【问题讨论】:
你可以得到与结果一样的状态码 let statusCode = response.response?.statusCode ?? 0 【参考方案1】: request.validate().responseJSON (response) in
let statusCode = response.response?.statusCode ?? 0
guard statusCode != 409 else
if let data = response.data, let errorJson = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any]
let errorMessage = errorJson["message"] as? String
let customError = CustomError(message: errorMessage)
single(.error(customError))
return
let result = response.result
switch result
case let .success(value): single(.success((response.response!, value)))
case let .failure(error): single(.error(error))
我想你可以通过这种方式实现你的要求。创建一个自定义错误类以将错误传递给完成。如果 errorJson 没有序列化,不要忘记调用完成。
class CustomError: Error
var localizedDescription: String message ?? ""
var message: String?
init(message: String?)
self.message = message
【讨论】:
以上是关于如何从 AFError 中确定具体的 409 错误?的主要内容,如果未能解决你的问题,请参考以下文章
Alamofire - 如何从 AFError 获取 API 错误
从 'AFError' 到 'AFError' 的条件转换总是成功
Alamofire.AFError.responseValidationFailed
使用消息“Alamofire.AFError.ResponseValidationFailureReason.unacceptableContentType”从存储中获取图像时出错