如何使用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-urlencoded
和multipart/form-data
編碼類型,我們需要feign-core
, feign-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
對其進行註釋。我們還將添加**name
和configuration
屬性**及其相應的值:
@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()
來執行相同的操作.