2015-11-19 76 views
22

我正在使用Retrofit 2.0使api調用返回Observables。當通話正常並且響應如預期時,這一切都很好。現在讓我們說我們有一個錯誤響應,它會拋出一個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的實例,那麼你就可以訪問改造響應

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

然後你可以使用converter to deserialize it(或自己做)。

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(); 
     } 
    } 
} 
相關問題