Я несколько дней бился головой, выясняя проблему, и, наконец, решил обратиться к экспертам.У меня есть REST API (RESTEasy) для потоковой передачи json через StreamingOutput, а принимающий клиент написан с использованием Spring-boot Webflux.По какой-то причине потоковая передача не работает должным образом на стороне клиента.Блокирует, пока не будет загружен весь ответ для обработки.
Когда я использовал curl для получения ответа, он работает как положено, так же как и с помощью HttpClient of netty, но, похоже, не работает с WebClient (spring-webflux).
Server
return Response.status(Response.Status.OK)
.entity(new JSONStreaming() { //implements javax.ws.rs.core.StreamingOutput;
@Override
public void streamOutput(OutputStream output) {
//passing output down the layers
}
}).build();
Клиент
Метод 1: работает должным образом.
HttpClient.create().get()
.uri(SERVICE_URL_TO_REST_API)
.responseContent()
.subscribe(byteBuf -> {
byte[] data = new byte[byteBuf.readableBytes()];
System.out.println(new String(data));
});
Метод 2: Это тоже работает .. (не скручиваем)) curl -i URL
Заголовки:
Content-Type: application/json
Transfer-Encoding: chunked
Код клиента, который не работает:
WebClient.get()
.uri(SERVICE_URL_TO_REST_API)
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToFlux(DataBuffer.class)
.subscribe(byteBuf -> {
byte[] data = new byte[byteBuf.readableByteCount()];
byteBuf.read(data);
System.out.println(new String(data));
});
Ожидает весьи затем записывает все данные целиком, а не сразу после получения.