2015-11-19 16 views
22

Retrofit 2.0を使用してObservablesを返すapi呼び出しを行っています。通話がうまくいって応答が期待どおりであれば、すべてうまく動作します。さて、エラー応答があったとしましょう。それはonErrorをスローします。私はそれがエラーであっても応答本体を読んでみたいと思います。Retrofit 2.0 Observablesを使用しているときにエラーが発生した場合のレスポンスボディの取得方法

@FormUrlEncoded 
@POST("tokenLogin") 
Observable<LoginResponse> loginWithToken(
     @Field("token") String pin 
); 

要求と応答が有効であるとき、私は右に観察を取得し、期待通りにエラーが発生した場合のonErrorが呼び出されています。

正しい応答:

{ "status" : "authenticated" } 

観察可能で、右観察可能にこれを変換し、私はLoginResponseオブジェクトとして応答を読み取ることができます。次のように

さて、エラー応答は次のとおりです。

{ "errorMessage" : "You need to take some xyz action" } 

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

答えて

36

スロー可能がHttpExceptionのインスタンスである場合だけをチェックして、あなたは、あなたがconverter to deserialize itを使用する(またはそれを自分で行う)ことができ、後付け応答

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

にアクセスすることができます。

9

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

@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(); 
     } 
    } 
} 
関連する問題