Прочитайте тело ответа в Android-перехватчике Android

Я использую простой класс Spring Interceptor для регистрации всех запросов и ответов REST для объекта RestTemplate в приложении для Android. Пока все работает нормально.

public class LoggerInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { Log.d(TAG, "Request body: " + new String(body)); // ...more log statements... ClientHttpResponse response = execution.execute(request, body); Log.d(TAG, "Response Headers: " + response.getHeaders()); return response; } 

При инициализации я вызываю:

 List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>(); LoggerInterceptor loggerInterceptor = new LoggerInterceptor(); interceptors.add(loggerInterceptor); restTemplate.setInterceptors(interceptors); 

Однако я не могу зарегистрировать response.getBody() в методе выше, потому что InputStream получает один раз и бросает исключение IllegalStateException, когда оно потребляется позже. Есть ли способ обойти это, чтобы я мог также регистрировать тело ответа?

    Чтобы разрешить несколько вызовов response.getBody() оберните ваш клиентский HTTP-запрос в BufferingClientHttpRequestFactory.

     ClientHttpRequestFactory requestFactory = new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()); restTemplate.setRequestFactory(requestFactory); 

    Внедрите ClientHttpResponse самостоятельно и добавьте setBody(byte[] body) и переопределите getBody . В приведенном выше коде вы можете сохранить массив байтов в ByteArrayInputStream , зарегистрировать то, что хотите, а затем задать массив байтов в экземпляре вашего класса, который реализует ClientHttpResponse , и затем вы можете вернуться.

    Intereting Posts
    Как настроить модуль библиотеки Android и называться несколькими проектами в Android Studio? Какой формат предназначен для камеры Android с необработанным PictureCallback? Код результата 3 при внедрении AppInvites Получите мой личный контакт данных Краткая сводная таблица JNI (512 записей) Android – не снимать скриншот текущего экрана Как я могу записывать голос в андроиде, пока удерживаю кнопку? Запуск активности от широковещательного приемника, который слушает исходящий вызов Изменение цвета строки состояния при изменении фрагмента Как я могу установить тег для фрагментов viewpager? Как вызвать onLowMemory на устройстве для тестирования Можно ли перетащить элемент за пределы RecyclerView? Android-тестирование устройства с ошибкой Robolectric throws AndroidManifest.xml не найдено или не файл Как играть в Android в Android-телефоне Android Получите SMS-намерение: получите идентификатор сообщения или идентификатор потока