Веб-клиент отправит POST без тела, получит исключение IllegalStateException - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь сделать вызов POST для API через WebClient без тела запроса (API не нуждается в теле):

webClient.post()
         .uri("url")
         .retrieve()
         .bodyToMono(CustomResponse.class);

Но вызов возвращает исключение:

Базовый HTTP-клиент завершен без отправки ответа. java .lang.IllegalStateException: Базовый HTTP-клиент завершен без отправки ответа.

Для другого API, для которого требуется тело запроса, я могу успешно выполнить вызов POST без проблем:

webClient.post()
         .uri("url")
         .bodyValue("value")
         .retrieve()
         .bodyToMono(CustomResponse.class);

Связана ли проблема с телом запроса WebClient? Как это исправить?

ОБНОВЛЕНИЕ

Ошибка происходит, потому что я добавил заголовок ContentType для Webclient через .defaultHeader("ContentType", JSON). Проблема исчезла после того, как я удалил заголовок.

1 Ответ

1 голос
/ 22 февраля 2020

Похоже, что нисходящий веб-сервис отвечает слишком медленно и превышает время ожидания соединения, следовательно, вы получаете эту проблему.

Если вам не нужен (или у ответа нет тела), вы можете использовать .toBodilessEntity() вместо. Таким образом, ваш фрагмент кода может быть переписан:

webClient.post()
         .uri("url")
         .retrieve()
         .toBodilessEntity();

Почему вы должны его использовать? Потому что вы всегда ответственны за освобождение ресурсов. Пожалуйста, прочитайте ПРИМЕЧАНИЕ раздел .

При использовании exchange () приложение несет ответственность за использование любого содержимого ответа независимо от сценария ( успех, ошибка, неожиданные данные и т. д. c). Невыполнение этого требования может привести к утечке памяти. См. ClientResponse для получения списка всех доступных опций для потребления тела.

...