【问题标题】:how to determine the specific 409 error from an AFError?如何从 AFError 中确定具体的 409 错误?
【发布时间】:2020-03-02 12:50:29
【问题描述】:

我有一个方法可以返回 Single<(HTTPURLResponse, Any)> 调用网络服务。

此调用出于多种原因返回 409,并且此原因在响应中作为 JSON 传递。 我知道 JSON 在 DataResponse 对象的数据属性中,但我希望将它放在发生错误时传递的 AFError 中。我想向用户显示与 JSON 响应相关的特定 409 错误消息,以让他了解发生了什么。

我怎么能这样做?

我在 Stackoverflow 和 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

标签: ios swift alamofire rx-swift


【解决方案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
}

}

【讨论】:

    猜你喜欢
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2021-07-13
    • 2022-01-20
    相关资源
    最近更新 更多