如何从 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”从存储中获取图像时出错

解析 JSON 时出现 AFError Alamofire 5

获取 Alamofire AFError 错误 Swift 的字符串值