Доступ к необработанному тексту ответа в обратном вызове Retrofit

Версия дооснащения: 2.1.0
Ok Версия http: 3.4.1

В onResponse методе моей реализации Callback я имеют следующую логику:

@Override
public void onResponse(Call<BaseResponseBody<T>> call, Response<BaseResponseBody<T>> response) {
  if (response != null && response.isSuccessful() && response.body() != null && response.body().containsValidSuccess()) {
    // Perform actions using response.body().getValue().
  } else {
    // If containsValidSuccess returns false, show a dialog that includes the raw JSON response body.
  }
}

Здесь BaseResponseBody - мой собственный тип (не связанный с _5 _ ), который является оболочкой для универсального типа T extends Validatable, где Validatable - это интерфейс, который предоставляет isValid метод, используемый для подтверждения того, что десериализованные ответы удовлетворяют заданным ограничениям.

Если я получаю якобы успешный ответ (HTTP-код 2XX, ненулевое тело ответа и т. Д.), Но десериализованное тело которого не проходит этот этап проверки (т.е. containsValidSuccess возвращает false), я хотел бы представить диалоговое окно, сообщение которого включает тело ответа необработанного (до десериализации). Однако я, похоже, не могу получить доступ к этому необработанному телу ответа через Retrofit _ 10_ типа.

Я читал другие страницы, которые, кажется, предлагают Interceptor может лучше удовлетворить мои потребности. Я знаком с перехватчиками и использую их для других манипуляций с вызовами в моем приложении, но я не понимаю, как точно передать информацию от моего перехватчика к последнему методу Callback.onResponse, чтобы представить диалог.

Я на правильном пути? Я упускаю что-то очевидное в API-интерфейсах Retrofit? Как я могу достичь поставленной цели? Спасибо!


person stkent    schedule 27.10.2016    source источник
comment
Вы видели этот stackoverflow.com/questions/ 33282889 / или этот stackoverflow.com/questions/37088975/   -  person OneCricketeer    schedule 27.10.2016
comment
Ага! Если я вызываю response.raw().body().string() в своем Callback, я вижу следующее исключение: java.lang.IllegalStateException: Cannot read raw response body of a converted body.. С другой стороны, вызов response.body() в моем Callback возвращает объект Retrofit Response, у которого нет метода string.   -  person stkent    schedule 27.10.2016
comment
@stkent у вас есть кастомный адаптер написан?   -  person Raghunandan    schedule 27.10.2016
comment
@Raghunandan, что именно вы имеете в виду под нестандартным адаптером? При настройке экземпляра Gson я использую несколько адаптеров нестандартного типа.   -  person stkent    schedule 27.10.2016
comment
Пользовательский класс @stkent, расширяющий CallAdapter.Factory   -  person Raghunandan    schedule 27.10.2016
comment
@stkent проверьте этот образец github.com/square/retrofit/blob/master/samples/src/main/java/, если это поможет, и можете ли вы опубликовать BaseResponseBody   -  person Raghunandan    schedule 27.10.2016
comment
@Raghunandan, спасибо, я проверю, что такое адаптер вызова! Как вы думаете, будет работать версия с перехватчиком? Вернуть настраиваемый подкласс Response, а затем попытаться применить обратный вызов?   -  person stkent    schedule 27.10.2016
comment
Удалось ли вам это решить?   -  person Jumpa    schedule 17.04.2019
comment
@Jumpa Я не делал; Я перешел к другому проекту и с тех пор не возвращался к нему. Помогает ли вам предложение Рагхунандана?   -  person stkent    schedule 17.04.2019
comment
Не совсем так, потому что мне нужно разобрать json с ошибкой, даже если код состояния https равен 200 ... stackoverflow.com/questions/55725736/   -  person Jumpa    schedule 17.04.2019


Ответы (1)


попробуй это

@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
 if (response != null && response.isSuccessful() && response.body() != null && response.body().containsValidSuccess()) {
   // Perform actions using response.body().getValue().
 } else {
  // If containsValidSuccess returns false, show a dialog that includes the raw JSON response body.
 }
}

после этого вы можете поместить его в свой POJO следующим образом

Gson g= new Gson(); 
POJOClass pojo=g.fromJson(response.body,POJOClass.class);
person Vishal Sanghani    schedule 27.10.2016
comment
Для этого мне потребуется вручную применить преобразование Gson к моему JsonObject; Я бы предпочел продолжать использовать для этого встроенный механизм адаптера, если это возможно. - person stkent; 27.10.2016
comment
get вы получите формат json в необработанном формате, после чего вы можете поместить его в свой POJO, как это Gson g = new Gson (); POJOClass pojo = g.fromJson (response.body, POJOClass.class); - person Vishal Sanghani; 27.10.2016
comment
Тогда я теряю общий характер обратного вызова, что является мрачным побочным эффектом. - person stkent; 27.10.2016