iOS アプリのネットワーキングに RxSwift で Moya を使用していObserver
ますonError
。
API は常に次の JSON 形式でエラー応答を返します。
{
"error": {
"message": "Error message goes here",
"code": "String error code"
}
}
目標は、次のコード スニペットのようなものを達成することです。ここで、渡されるエラーonError
は、型ではなくカスタム エラー型Moya.Error
です。
observable
.subscribe(
onNext: { response in
// Do typical onNext stuff
},
onError: { error in
// Get and consume my custom error type here:
let customError = error as! MyCustomErrorModel
print("My API's error message: \(customError.error?.message)")
print("My API's error code: \(customError.error?.code)")
})
カスタムを使用してこれらのエラーを正常にインターセプトし、カスタム エラー モデルに逆シリアル化することができます(この SO の質問PluginType
から以下に貼り付けます) が、これらのモデルを最終的に.Observer
import Foundation
import Moya
import ObjectMapper
import Result
struct CustomAPIErrorPlugin: PluginType {
// Called immediately before a request is sent over the network (or stubbed).
func willSendRequest(request: RequestType, target: TargetType) { }
// Called after a response has been received, but before the MoyaProvider has invoked its completion handler.
func didReceiveResponse(result: Result<Moya.Response, Moya.Error>, target: TargetType) {
let responseJSON: AnyObject
if let response = result.value {
do {
responseJSON = try response.mapJSON()
if let errorResponse = Mapper<MyCustomErrorModel>().map(responseJSON) {
print("Custom error code from server: \(errorResponse.error?.code)")
}
} catch {
print("Failure to parse JSON response")
}
} else {
print("Network Error = \(result.error)")
}
}