2016-03-18 3 views
2

У меня есть REST Server, Моя проблема возникает, когда мой ответ не увенчался успехом. Я хочу проанализировать ошибку из тела ответа и показать ее пользователю (передать информацию об ошибке в вызывающая активность)Как добавить GSON CallAdapterFactory только тогда, когда Retrofit Response Succesfull

@Named("rest_api") 
@Singleton 
@Provides 
Interceptor provideRESTInterceptor(final UserManager userManager) { 
    return new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request original = chain.request(); 
      String token = userManager.getJwt(); 

      Request request = original.newBuilder() 
        .header("Accept", "application/json") 
        .header("Authorization", "Bearer "+token) 
        .method(original.method(), original.body()) 
        .build(); 

      Log.i(LOG_TAG, "REQUEST URL "+request.uri()); 
      Response response = chain.proceed(request); 

      if(!response.isSuccessful()) { 
       // How do i send this error to my Activity. 

       APIError apiError = new APIError(response.code(),response.body().string()); 
      } 

      // Customize or return the response 
      return response; 
     } 
    }; 
} 

Я использую RxJavaConverter

@Named("rest_api") 
@Singleton 
@Provides 
Retrofit provideRESTRetrofit(@Named("rest_api")OkHttpClient client, Converter.Factory converter, CallAdapter.Factory rxJava) { 
    return new Retrofit.Builder() 
      .baseUrl(PUBLIC_PRODUCTION_URL) 
      .client(client) 
      .addCallAdapterFactory(rxJava) 
      .addConverterFactory(converter) 
      .build(); 
} 

с Модернизированный 2.0, даже если ответ не увенчались успехом он пытается преобразовать данные с заданной GSON в (POJO), и, таким образом, бросить ошибка, и я потерял фактическое сообщение об ошибке.

+0

Посмотрите на это: http://stackoverflow.com/questions/33774940/get-response-status-code-using-retrofit-2 -0-и-rxjava/33775529 # 33775529. Я думаю, вы могли бы удалить проверку успеха из «Interceptor» и вместо этого проверить позже в «Subscriber» - или, может быть, добавить «Transformer» в свою Rx-цепочку, которая для каждого запроса проверяет успех и обрывает ошибки в «APIError» '. Это поможет решить вашу проблему? –

+0

@ david.mihola На самом деле я использую ResponseBody сейчас, но чем этот компромисс с моей необходимостью автоматически конвертировать ответ на POJO или с помощью конвертера Gson для Retrofit, тем не менее, теперь я могу продолжать с этим :) – Bikash

+0

О, Прошу прощения, это не то, что я имел в виду. Я имел в виду только «внешнюю» часть, то есть вы можете использовать «Observable >» и иметь доступ как к «Response» (с кодами ответа HTTP и т. Д.), Так и к анализу 'YourModelClass' (который в 'response.body()'). –

ответ

2

Как @david: mihola предположил, что это сработало, используя объект Retrofit Response, я смог достичь этого.

Response<MyObject> response; 
if(response.isSucessful) { 
    MyObject obj = response.body(); 
} else { 
    // You can process your error message from the reponse 
} 

Он действительно спас меня от партии ручной GSON разборе

Смежные вопросы