以下は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, String), 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
}
}
}, 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)
これで問題が解決するかどうか確認していただけますか?
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)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加