我有一个返回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
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
}
}