2015-11-19 75 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(); 
     } 
    } 
} 
相关问题