如何解决如何从Combine + Alamofire 错误响应中获取数据值?
下面是我调用 api 的代码,当 api 调用出错时它返回 Swift.Error。
AccountAPI.postAccount(withSignUpCommand: signUpCommand)
.sink(receiveCompletion: { [weak self] result in
guard let self = self else { return }
switch result {
case .finished:
self.logger.debug("signUp completed.")
case .failure(let error):
self.isAuthenticating = false
self.logger.error("signUp error : \(error)")
}
},receiveValue: { [weak self] (statusCode,userId) in
guard let self = self else { return }
self.logger.debug("signUp status code : \(statusCode)")
guard (200...299).contains(statusCode) else {
return
}
self.logger.debug("UserId: \(userId)")
})
.store(in: &disposables)
还有我的出版商
static func postAccount(
withSignUpCommand signUpCommand: SignUpCommand,apiResponseQueue: DispatchQueue = CloudHospitalClientAPI.apiResponseQueue
) -> AnyPublisher<(Int,String),Error> {
let url = "\(CloudHospitalClientAPI.identityBasePath)/api/v1/accounts"
let parameters = JSONEncodingHelper.encodingParameters(forEncodableObject: signUpCommand)
return Future<(Int,Error>.init { promise in
postAccountWithRequestBuilder(withURLString: url,withParameters: parameters,isBody: true).execute(apiResponseQueue) { result -> Void in
switch result {
case let .success(response):
promise(.success((response.statusCode,response.body!)))
case let .failure(error):
promise(.failure(error))
}
}
}
.eraseToAnyPublisher()
}
static func postAccountWithRequestBuilder(
withURLString URLString: String,withParameters parameters: [String: Any]?,isBody: Bool
) -> RequestBuilder<String> {
let url = URLComponents(string: URLString)
let requestBuilder: RequestBuilder<String>.Type = CloudHospitalClientAPI.requestBuilderFactory.getBuilder()
return requestBuilder.init(method: "POST",URLString: (url?.string ?? URLString),parameters: parameters,isBody: isBody)
}
以下格式的 api 错误响应,我想解析此数据,但根本无法访问此值。
尝试将返回类型更改为自定义错误响应,但没有成功。
请分享一些建议,我可以在其中插入解码错误响应代码并返回调用者函数。
提前致谢。
感谢布鲁诺,下面是我编辑过的代码。
AccountAPI.postAccount(withSignUpCommand: signUpCommand)
.sink(receiveCompletion: { [weak self] result in
guard let self = self else { return }
switch result {
case .finished:
self.logger.debug("signUp completed.")
case .failure(let error):
self.isAuthenticating = false
self.logger.error("signUp error : \(error)")
if case let ErrorResponse.error(_,data,_) = error {
let decoder = JSONDecoder()
let identityErrors = try! decoder.decode([IdentityError].self,from: data!)
// TODO: Decode `data` here...
self.logger.debug("data: \(String(describing: identityErrors))")
self.errors = identityErrors
}
}
},userId) in
guard let self = self else { return }
self.logger.debug("signUp status code : \(statusCode)")
guard (200...299).contains(statusCode) else {
return
}
self.logger.debug("UserId: \(userId)")
})
.store(in: &disposables)
解决方法
你能看看这是否能解决你的问题吗?
AccountAPI.postAccount(withSignUpCommand: signUpCommand)
.sink(receiveCompletion: { [weak self] result in
guard let self = self else { return }
switch result {
case .finished:
self.logger.debug("signUp completed.")
case .failure(let error):
self.isAuthenticating = false
self.logger.error("signUp error : \(error)")
if case let ErrorResponse.error(statusCode,data,error) = error {
// TODO: Decode `data` here...
}
}
},receiveValue: { [weak self] (statusCode,userId) in
guard let self = self else { return }
self.logger.debug("signUp status code : \(statusCode)")
})
.store(in: &disposables)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。