如何使用Open Feign 文件上傳

    1.概述

    在本教程中,我們將演示如何使用Open Feign上傳文件。 Feign是微服務開發人員以聲明方式通過REST API與其他微服務進行通信的強大工具。

    2.先決條件

    假設公開了一個RESTful Web服務用於文件上傳,下面給出了詳細信息:

    POST http://localhost:8081/upload-file

    因此,為了說明通過Feign客戶端上傳文件的過程,我們將調用公開的Web服務API,如下所示:

    @PostMapping(value = "/upload-file")
    
     public String handleFileUpload(@RequestPart(value = "file") MultipartFile file) {
    
     // 文件上傳邏輯
    
     }

    3.依存關係

    為了支持application/x-www-form-urlencodedmultipart/form-data編碼類型,我們需要feign-corefeign-form ,feign-form-spring模塊。

    因此,我們將以下依賴項添加到Maven:

    <dependency>
    
     <groupId>io.github.openfeign</groupId>
    
     <artifactId>feign-core</artifactId>
    
     <version>10.12</version>
    
     </dependency>
    
     <dependency>
    
     <groupId>io.github.openfeign.form</groupId>
    
     <artifactId>feign-form</artifactId>
    
     <version>3.8.0</version>
    
     </dependency>
    
     <dependency>
    
     <groupId>io.github.openfeign.form</groupId>
    
     <artifactId>feign-form-spring</artifactId>
    
     <version>3.8.0</version>
    
     </dependency>

    我們還可以使用在內部具有feign-core spring-cloud-starter-openfeign

    <dependency>
    
     <groupId>org.springframework.cloud</groupId>
    
     <artifactId>spring-cloud-starter-openfeign</artifactId>
    
     <version>3.0.1</version>
    
     </dependency>

    4.配置

    讓我們將@EnableFeignClients添加到我們的主類中。您可以訪問spring cloud open feign教程以了解更多詳細信息:

    @SpringBootApplication
    
     @EnableFeignClients
    
     public class ExampleApplication {
    
     public static void main(String[] args) {
    
     SpringApplication.run(ExampleApplication.class, args);
    
     }
    
     }

    @EnableFeignClients批註允許組件掃描聲明為Feign客戶端的接口。

    5.通過Feign Client上傳文件

    5.1。通過帶註解的客戶端

    讓我們為帶註解的@FeignClient類創建所需的編碼器:

    public class FeignSupportConfig {
    
     @Bean
    
     public Encoder multipartFormEncoder() {
    
     return new SpringFormEncoder(new SpringEncoder(new ObjectFactory<HttpMessageConverters>() {
    
     @Override
    
     public HttpMessageConverters getObject() throws BeansException {
    
     return new HttpMessageConverters(new RestTemplate().getMessageConverters());
    
     }
    
     }));
    
     }
    
     }

    請注意, FeignSupportConfig不需要使用@Configuration.

    現在,讓我們創建一個接口並使用@FeignClient對其進行註釋。我們還將添加**nameconfiguration屬性**及其相應的值:

    @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。

    在使用Hystrix ,我們將使用fallback屬性添加作為替代。當上傳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客戶需要進行自定義,這在上述註釋方式中是不可能的。在這種情況下,我們使用Feign.builder() API創建客戶端。

    讓我們構建一個代理接口,其中包含針對REST API的用於文件上傳的文件上傳方法:

    public interface UploadResource {
    
     @RequestLine("POST /upload-file")
    
     @Headers("Content-Type: multipart/form-data")
    
     Response uploadFile(@Param("file") MultipartFile file);
    
     }

    註釋**@RequestLine定義API的HTTP方法和相對資源路徑,而@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代理接口的實例。我們還使用了SpringFormEncoder和RESTful Web Service的URL。

    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.結論

    在本文中,我們展示瞭如何使用OpenFeign實現分段文件上傳,以及將其包含在簡單應用程序中的各種方法。

    我們還看到瞭如何配置Feign客戶端或使用Feign.Builder()來執行相同的操作.