В нашем проекте мы используем фиктивный клиент для вызова сторонней службы. Для типа контента application/json все работает нормально. Но у нас есть требование, когда URL-адрес сторонней службы возвращает PDF-файл, и в этот раз мы получаем исключение.
Из-за соображений безопасности я не могу вставлять журналы и код, но если кто-нибудь поделится со мной кодом для загрузки pdf-файла из фиктивного клиента, это было бы очень полезно для меня.
Заранее спасибо!!





Вы можете использовать byte[] в качестве возвращаемого типа.
@FeignClient(url = "url", name = "name")
public interface SomeFeignClient {
@GetMapping("/give-me-a-pdf")
byte[] getPDF();
}
Ваша служба просто позвонит
public byte[] getPDF() {
return SomeFeignClient.getPDF();
}
Теперь с массивом байтов вы можете выполнить любую операцию, например, сохранить файл, используя
FileUtils.writeByteArrayToFile(new File("pathname"), resource);
или предоставить конечную точку для загрузки файла (загрузка Spring может вернуть практически все без использования какой-либо внешней библиотеки)
@GetMapping("/pdf")
ResponseEntity getPDF() {
byte[] resource = SomeFeignClient.getPDF();
return ResponseEntity.ok()
.contentLength(resource.length)
.contentType(MediaType.APPLICATION_PDF)
.body(resource);
}
Мне интересно, существует ли потоковый режим вместо получения всех байтов? Потому что это может привести к проблемам с памятью, особенно для больших файлов PDF, когда этот контроллер находится в стрессовом режиме...