У меня есть 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), и, таким образом, бросить ошибка, и я потерял фактическое сообщение об ошибке.
Посмотрите на это: http://stackoverflow.com/questions/33774940/get-response-status-code-using-retrofit-2 -0-и-rxjava/33775529 # 33775529. Я думаю, вы могли бы удалить проверку успеха из «Interceptor» и вместо этого проверить позже в «Subscriber» - или, может быть, добавить «Transformer» в свою Rx-цепочку, которая для каждого запроса проверяет успех и обрывает ошибки в «APIError» '. Это поможет решить вашу проблему? –
@ david.mihola На самом деле я использую ResponseBody сейчас, но чем этот компромисс с моей необходимостью автоматически конвертировать ответ на POJO или с помощью конвертера Gson для Retrofit, тем не менее, теперь я могу продолжать с этим :) – Bikash
О, Прошу прощения, это не то, что я имел в виду. Я имел в виду только «внешнюю» часть, то есть вы можете использовать «Observable>» и иметь доступ как к «Response» (с кодами ответа HTTP и т. Д.), Так и к анализу 'YourModelClass' (который в 'response.body()'). –