1. Обзор
В этом учебнике мы продемонстрируем, как загрузить файл с помощью Open Feign. Feign является мощным инструментом для разработчиков микрослужб для общения через REST API с другими микрослужбами в декларативной манере.
2. Предпосылки
Давайте предположим, что веб-служба RESTful подвергается для загрузки файла, и приведены ниже подробности:
POST http://localhost:8081/upload-file
Таким образом, чтобы объяснить загрузку файла через Симулировать клиента, мы назовем открытый API веб-службы, как показано ниже:
@PostMapping(value = "/upload-file") public String handleFileUpload(@RequestPart(value = "file") MultipartFile file) { // File upload logic }
3. Зависимости
Для поддерживать приложение/x-www-форма-urlencoded и многопартийные/формоформные данные типы кодирования для загрузки файла, мы должны симулировать основные , симулировать форму , и симулировать-форма-весна Модули.
Таким образом, мы добавим следующие зависимости в Maven:
io.github.openfeign feign-core 10.12 io.github.openfeign.form feign-form 3.8.0 io.github.openfeign.form feign-form-spring 3.8.0
Мы также можем использовать весна-облако-стартер-открытый который имеет симулировать основные внутренне:
org.springframework.cloud spring-cloud-starter-openfeign 3.0.1
4. Конфигурация
Давайте добавим @EnableFeignClients к нашему основному классу. Вы можете посетить весеннее облако открыто симулировать учебник для более подробной информации:
@SpringBootApplication @EnableFeignClients public class ExampleApplication { public static void main(String[] args) { SpringApplication.run(ExampleApplication.class, args); } }
@EnableFeignClients аннотация позволяет сканировать компоненты для интерфейсов, которые объявлены симулировать клиентов.
5. Загрузка файлов через Feign Клиента
5.1. Через аннотированного клиента
Давайте создадим необходимый кодер для аннотированного @FeignClient класс:
public class FeignSupportConfig { @Bean public Encoder multipartFormEncoder() { return new SpringFormEncoder(new SpringEncoder(new ObjectFactory() { @Override public HttpMessageConverters getObject() throws BeansException { return new HttpMessageConverters(new RestTemplate().getMessageConverters()); } })); } }
Обратите внимание, что СимулироватьПоддерживайКонфиг не нужно аннотировать с @Configuration.
Теперь давайте создадим интерфейс и аннотировать его с помощью @FeignClient . Мы также добавим имя и конфигурация атрибуты с соответствующими значениями:
@FeignClient(name = "file", url = "http://localhost:8081", configuration = FeignSupportConfig.class) public interface UploadClient { @PostMapping(value = "/upload-file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) String fileUpload(@RequestPart(value = "file") MultipartFile file); }
UploadClient указывает на API, упомянутый в предпосылкой .
Во время работы с Хайстрикс , мы будем использовать откат атрибут для добавления в качестве альтернативы. Это делается, когда api загрузки не .
Теперь наши @FeignClient будут выглядеть так:
@FeignClient(name = "file", url = "http://localhost:8081", fallback = UploadFallback.class, configuration = FeignSupportConfig.class)
И, наконец, мы можем UploadClient непосредственно из уровня обслуживания:
public String uploadFile(MultipartFile file) { return client.fileUpload(file); }
5.2. Через Feign.builder
В некоторых случаях, наши притворные клиенты должны быть настроены, что невозможно в аннотации образом, как описано выше. В таком случае мы создаем клиентов, использующих Feign.builder () API.
Давайте построим прокси-интерфейс, содержащий метод загрузки файлов, ориентированный на API REST для загрузки файла:
public interface UploadResource { @RequestLine("POST /upload-file") @Headers("Content-Type: multipart/form-data") Response uploadFile(@Param("file") MultipartFile file); }
Аннотация @RequestLine определяет метод HTTP и относительный путь ресурсов API и @Headers определяет заготовки, такие как Content-Type.
Теперь давайте вызовем указанный метод в интерфейсе прокси. Мы сделаем это из нашего класса обслуживания:
public boolean uploadFileWithManualClient(MultipartFile file) { UploadResource fileUploadResource = Feign.builder().encoder(new SpringFormEncoder()) .target(UploadResource.class, HTTP_FILE_UPLOAD_URL); Response response = fileUploadResource.uploadFile(file); return response.status() == 200; }
Здесь мы использовали Feign.builder () утилита для создания экземпляра UploadResource прокси-интерфейс. Мы также использовали ВеснаФормеЭнкодер и URL-адрес на основе веб-сервиса RESTful.
6. Проверка
Давайте создадим тест для проверки загрузки файла с аннотированным клиентом:
@Test public void whenAnnotatedFeignClient_thenFileUploadSuccess() { ClassLoader classloader = Thread.currentThread().getContextClassLoader(); File file = new File(classloader.getResource(FILE_NAME).getFile()); Assert.assertTrue(file.exists()); FileInputStream input = new FileInputStream(file); MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); String uploadFile = uploadService.uploadFile(multipartFile); Assert.assertNotNull(uploadFile); }
А теперь давайте создадим еще один тест для проверки загрузки файла с помощью Feign.Builder () :
@Test public void whenFeignBuilder_thenFileUploadSuccess() throws IOException { // same as above Assert.assertTrue(uploadService.uploadFileWithManualClient(multipartFile)); }
7. Заключение
В этой статье мы показали, как реализовать загрузку Multipart File с помощью OpenFeign, и различные способы включить его в простое приложение.
Мы также видели, как настроить симулировать клиента или использовать Feign.Builder () для того, чтобы выполнить ту же .
Как обычно, все образцы кода, используемые в этом учебнике, доступны более чем на GitHub.