Разница между JdkClientHttpRequestFactory, упакованным в буферизацию, и SimpleClientHttpRequestFactory при обнаружении IJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Разница между JdkClientHttpRequestFactory, упакованным в буферизацию, и SimpleClientHttpRequestFactory при обнаружении I

Сообщение Anonymous »


Я столкнулся со странной проблемой, которой не могу найти объяснения. Это происходит, когда настроенный RestClient обнаруживает какой-либо ошибочный код состояния HTTP, например, 401 Неавторизованный.

Конфигурация аналогична: для регистрации ответов в целях разработки я обертываю ClientHttpRequestFactory в BufferingClientHttpRequestFactory.

Единственная разница в том, какую реализацию я использую. Я переключаюсь между этими двумя:
[*]JdkClientHttpRequestFactory [*]SimpleClientHttpRequestFactory
@Bean общественный RestClient restClient() { // Переключение между SimpleClientHttpRequestFactory и JdkClientHttpRequestFactory окончательный вар clientHttpRequestFactory = новый SimpleClientHttpRequestFactory (); вернуть RestClient.builder() .requestFactory(новый BufferingClientHttpRequestFactory(clientHttpRequestFactory)) .requestInterceptors(список -> list.add(новый LoggingClientHttpRequestInterceptor())) .строить(); } Вот перехватчик журналирования:

@Slf4j частный статический класс LoggingClientHttpRequestInterceptor реализует ClientHttpRequestInterceptor { @Override общедоступный перехват ClientHttpResponse (окончательный запрос HttpRequest, тело последнего байта [], окончательное выполнение ClientHttpRequestExecution) выдает IOException { // Выполняем вызов REST. окончательный вар clientHttpResponse = выполнение.execute(запрос, тело); // Копируем и регистрируем тело ответа. пытаться { // Первое чтение входного потока. log.info("Попытка №1"); окончательный ответ var = StreamUtils.copyToString(clientHttpResponse.getBody(), UTF_8); log.info("#1 status={}, ответ={}", clientHttpResponse.getStatusCode().value(), ответ); } catch (IOException e) { // Второе чтение входного потока. log.info("Попытка №2"); окончательный ответ var = StreamUtils.copyToString(clientHttpResponse.getBody(), UTF_8); log.info("#2 status={}, ответ={}", clientHttpResponse.getStatusCode().value(), ответ); } // Возвращаем ответ клиента. вернуть клиентHttpResponse; } } По неизвестной причине (я ничего не нашел в документации) в случае использования SimpleClientHttpRequestFactory мне приходится дважды вызывать clientHttpResponse.getBody(): один раз, чтобы перехватить IOException и затем, наконец, получить тело ответа.

Найдите выходные данные журнала для обоих случаев ниже для лучшего сравнения при вызове любой конечной точки, возвращающей ответ 4XX:
[*]
JdkClientHttpRequestFactory — ожидаемое поведение

2024-01-04T15:25:41.138+07:00 INFO 62777 --- [main]: попытка №1 2024-01-04T15:25:41.140+07:00 INFO 62777 --- [main]: #1 status=400, response={"foo": "bar"} 2024-01-04T15:25:41.141+07:00 ИНФОРМАЦИЯ 62777 --- [основная]: Готово [*]SimpleClientHttpRequestFactory – неожиданное поведение

2024-01-04T15:26:41.518+07:00 INFO 62839 --- [main]: попытка №1 2024-01-04T15:26:41.767+07:00 ИНФОРМАЦИЯ 62839 --- [основной]: попытка №2 2024-01-04T15:26:41.769+07:00 INFO 62839 --- [main]: #2 status=400, response={"foo": "bar"} 2024-01-04T15:26:41.771+07:00 ИНФОРМАЦИЯ 62839 --- [основная]: Готово Я знаю, что каждый ClientHttpRequestFactory имеет свое поведение, однако я бы никогда не ожидал, что в случае с SimpleClientHttpRequestFactory потребуется вызвать clientHttpResponse.getBody( ) дважды, чтобы получить фактический ответ после перехвата IOException. Во время отладки я также обнаружил, что второй и последующие вызовы возвращаются к одному и тому же экземпляру.

Каково объяснение такого поведения SimpleClientHttpRequestFactory?
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • «EOF достигнут во время чтения» с помощью Spring RestClient и Wiremock с использованием JdkClientHttpRequestFactory
    Гость » » в форуме JAVA
    0 Ответы
    62 Просмотры
    Последнее сообщение Гость
  • Почему настройка SimpleClientHttpRequestFactory Resolve 404 ошибки в Spring RestClient?
    Anonymous » » в форуме JAVA
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • IOS AVPlayer отменяет буферизацию
    Anonymous » » в форуме IOS
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous
  • Отключить буферизацию sys.stdin в Python 3
    Anonymous » » в форуме Python
    0 Ответы
    93 Просмотры
    Последнее сообщение Anonymous
  • Как правильно реализовать буферизацию глубины в Vulkan с помощью C++?
    Anonymous » » в форуме C++
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»