Разница между JdkClientHttpRequestFactory, упакованным в буферизацию, и SimpleClientHttpRequestFactory при обнаружении I ⇐ JAVA
Разница между JdkClientHttpRequestFactory, упакованным в буферизацию, и SimpleClientHttpRequestFactory при обнаружении I
Я столкнулся со странной проблемой, которой не могу найти объяснения. Это происходит, когда настроенный 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?
Я столкнулся со странной проблемой, которой не могу найти объяснения. Это происходит, когда настроенный 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?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему настройка SimpleClientHttpRequestFactory Resolve 404 ошибки в Spring RestClient?
Anonymous » » в форуме JAVA - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-