拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何使用Open Feign 文件上传

如何使用Open Feign 文件上传

白鹭 - 2022-11-26 621 0 0

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.openfeigngroupId>

 <artifactId>feign-coreartifactId>

 <version>10.12version>

 dependency>

 <dependency>

 <groupId>io.github.openfeign.formgroupId>

 <artifactId>feign-formartifactId>

 <version>3.8.0version>

 dependency>

 <dependency>

 <groupId>io.github.openfeign.formgroupId>

 <artifactId>feign-form-springartifactId>

 <version>3.8.0version>

 dependency>

我们还可以使用在内部具有feign-core spring-cloud-starter-openfeign

<dependency>

 <groupId>org.springframework.cloudgroupId>

 <artifactId>spring-cloud-starter-openfeignartifactId>

 <version>3.0.1version>

 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() { @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()来执行相同的操作.

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *