如何从AFError确定特定的409错误?

问题描述 投票:0回答:1

我有一个返回Single<(HTTPURLResponse, Any)>来调用Web服务的方法。

此调用出于多种原因返回409,并且此原因在响应中作为JSON传递。我知道JSON位于DataResponse对象的data属性中,但我希望将其包含在发生错误时传递的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

ios swift alamofire rx-swift
1个回答
0
投票
 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))
        }
    }

我想您可以通过这种方式满足您的要求。创建一个自定义Error类以将错误传递给完成。如果errorJson未序列化,请不要忘记调用完成。

class CustomError: Error {

var localizedDescription: String { message ?? "" }

var message: String?

init(message: String?) {
    self.message = message
}

}

© www.soinside.com 2019 - 2024. All rights reserved.