Я пишу Rest API, который проксирует двоичные изображения. Я пытаюсь использовать поддержку, недавно добавленную в Spring WebFlux для сопрограмм Kotlin. В контроллере я делаю запрос в другой сервис, который возвращает двоичное изображение и затем передает это изображение вызывающему клиенту в теле ответа. Я использую DataBuffer, который, как я понял, не загрузит в память весь ответ другого сервиса. Но я получаю следующую ошибку:
Превышено ограничение на максимальное количество байтов в буфере: 262144
Я прочитал здесь посты, в которых описывается, как увеличить размер буфера, но это напрашивается на вопрос «Загружает ли DataBuffer все тело ответа в памяти?»
Двоичные изображения, с которыми я имею дело, могут иметь размер в ГБ.
Вот код моего контроллера.
@GetMapping("/test")
internal suspend fun proxy(
request: ServerHttpRequest,
@RequestParam("forwardUrl")
forwardUrl: String
): ResponseEntity<StreamingResponseBody> {
val stream = client.get()
.uri(forwardUrl)
.awaitExchange()
.awaitBody<DataBuffer>()
val responseBody: StreamingResponseBody = StreamingResponseBody { outputStream: OutputStream ->
Unit
stream.asInputStream().transferTo(outputStream)
}
return ResponseEntity<StreamingResponseBody>(responseBody, HttpStatus.OK)
}
Как правильно выполнить потоковую передачу тела ответа запроса WebClient в тело ответа на запрос, обрабатываемый моим контроллером, без загрузки всего тела ответа в память?
Спасибо .