Как обработать Spring WebClient получить приложение / октет-поток как тело InputStream? - PullRequest
2 голосов
/ 13 июня 2019

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

org.springframework.web.reactive.function.client.WebClient показался мне подходящим вариантом, но я столкнулся с «UnsupportedMediaTypeException: тип содержимого« application / octet-stream »не поддерживается.

Вот небольшой пример кода.

@Autowired WebClient.Builder webClientBuilder;
....
ClientResponse clientResponse = webClientBuilder.clientConnector(this.connector)
.build()
.get()
.uri(uri)
.accept(MediaType.APPLICATION_OCTET_STREAM)
.exhange()
.block(Duration.of(1, ChronoUnit.MINUTES));

// blows up here, inside of the body call
InputStream responseInputStream = clientResponse.body(BodyExtractors.toMono(InputStream.class)).block(Duration.of(1, ChronoUnit.MINUTES));

Вот фрагмент трассировки стека.

org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/octet-stream' not supported
   at org.springframework.web.reactive.function.BodyExtractors.lambda$readWithMessageReaders$20(BodyExtractors.java:254)
   at java.util.Optional.orElseGet(Optional.java:267)
   at org.springframework.web.reactive.function.BodyExtractors.readWithMessageReaders(BodyExtractors.java:250)
   at org.springframework.web.reactive.function.BodyExtractors.lambda$toMono$2(BodyExtractors.java:92)

......

Я нахожусь на весеннем webflux 5.0.7.

Я уверен, что Spring Webclient должен поддерживать что-то помимо JSON. Я просто не знаю, как это сделать. Помощь

1 Ответ

2 голосов
/ 13 июня 2019

Не эксперт, но вместо InputStream вы можете получить Flux<byte[]>, где каждый опубликованный массив будет содержать фрагмент тела ответа), используя

.get()
.uri(uri)
.accept(MediaType.APPLICATION_OCTET_STREAM)
.retrieve()
.bodyToFlux(byte[].class)

Вы также можете сделать то же самоес ByteBuffer вместо byte[], если вы предпочитаете.

...