Retrofit 2.0を使用して、Observablesを返すAPI呼び出しを行っています。通話が正常に完了し、応答が期待どおりである場合、すべて正常に機能します。ここで、エラー応答があり、onErrorがスローされたとしましょう。エラーの場合でも、応答本文を読みたいです。
例
@FormUrlEncoded
@POST("tokenLogin")
Observable<LoginResponse> loginWithToken(
@Field("token") String pin
);
リクエストとレスポンスが有効な場合、正しいオブザーバブルを取得し、エラーが発生したときに予想どおりにonErrorが呼び出されます。
正しい応答:
{ "status" : "authenticated" }
Observableはこれを正しいObservableに変換し、LoginResponseオブジェクトとして応答を読み取ることができます。
現在、エラー応答は次のとおりです。
{ "errorMessage" : "You need to take some xyz action" }
そのエラー応答を読み取り、ユーザーにメッセージを表示したいと思います。それをどうやってやるの?
スロー可能オブジェクトがHttpExceptionのインスタンスであるかどうかを確認するだけで、レトロフィット応答にアクセスできます
if (e instanceof HttpException) {
ResponseBody body = ((HttpException) e).response().errorBody();
...
}
次に、 コンバーターをデシリアライズするためのコンバーター を使用します(または自分で実行します)。
このコードブロックを追加して、エラーメッセージを表示できます。
@Override
public void onFailure(Throwable t) {
if (t instanceof HttpException) {
ResponseBody body = ((HttpException) t).response().errorBody();
Gson gson = new Gson();
TypeAdapter<ErrorParser> adapter = gson.getAdapter
(ErrorParser
.class);
try {
ErrorParser errorParser =
adapter.fromJson(body.string());
Logger.i(TAG, "Error:" + errorParser.getError());
} catch (IOException e) {
e.printStackTrace();
}
}
}