web-dev-qa-db-ja.com

Retrofit 2.0 Observablesを使用しているときにエラーが発生した場合に応答本文を取得する方法

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" }

そのエラー応答を読み取り、ユーザーにメッセージを表示したいと思います。それをどうやってやるの?

29
achie

スロー可能オブジェクトがHttpExceptionのインスタンスであるかどうかを確認するだけで、レトロフィット応答にアクセスできます

if (e instanceof HttpException) {
    ResponseBody body = ((HttpException) e).response().errorBody();
    ...
}

次に、 コンバーターをデシリアライズするためのコンバーター を使用します(または自分で実行します)。

45
Tim C

このコードブロックを追加して、エラーメッセージを表示できます。

@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();
        }
    }
}
11
Akshay Shinde