Использование StreamingResponseBody с помощью Spring

#java #spring-boot #spring-cloud-feign

#java #весенняя загрузка #spring-cloud-симулировать

Вопрос:

У меня есть простой веб-сервис, который передает файл с использованием StreamingResponseBody. Определение выглядит следующим образом:

 @GetMapping("/files/{filename}")
public ResponseEntity<StreamingResponseBody> download(@PathVariable String filename) {
    ...
    StreamingResponseBody responseBody = out -> {
        ...
    }
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentLength(byteArray.length);

    return new ResponseEntity(responseBody, httpHeaders, HttpStatus.OK);
}
  

Это работает хорошо, но теперь мне нужно использовать его в клиентском приложении.
Я использую spring для его использования, но я не могу найти способ прочитать поток и записать его в файл по мере его прохождения…

Я пытался использовать feign, но, похоже, он его не поддерживает. Я пытался использовать RestTemplate, но я не могу заставить его работать…

Поддерживает ли Spring потоковую передачу на стороне клиента? Кто-нибудь знает, как это сделать? Возможно, с использованием чистого Java API?

Большое спасибо за вашу помощь!

Комментарии:

1. Вы нашли способ сделать это?

2. Привет, нет, извините. Возможно, я мог бы попытаться переопределить некоторые классы. Но я не нашел никакого решения «из коробки».

Ответ №1:

Вы можете использовать Http-клиент Apache (org.apache.httpcomponents:httpclient:4.5.12):

 URI uri = new URIBuilder()
        .setScheme(scheme)
        .setHost(host)
        .setPort(port)
        .setPath(url)
        .build();
HttpUriRequest request = RequestBuilder.get(uri).build();

try (CloseableHttpClient httpClient = HttpClients.createDefault();
     CloseableHttpResponse httpResponse = httpClient.execute(request);
     InputStream inputStream = httpResponse.getEntity().getContent()) {

    // Do with stream whatever you want, for example put it to File using FileOutputStream and 'inputStream' above.

}
  

Комментарии:

1. Привет @PavelDudin — ваш ответ правильный — это способ использования URL. Однако вопрос был конкретно о Spring, поэтому вам, возможно, следует упомянуть, что ваш ответ не отвечает на OP.

2. Привет @PavelDudin, спасибо за ваш ответ. MrR прав, я спрашивал конкретно о spring. Но ваш ответ также может быть использован в среде Spring.