feign技巧 - form方式传值(上传文件)

feign技巧 - form方式传值。

1. 前言

直接正题。 如何使用feign进行fom表单方式的请求调用,以及其中的注意事项。

2. 调用样例


    // =============================================== feign调用端
    //	注意事项:
    //		1. 两个参数都要使用@RequestPart注解进行标注.
    //		2. POST请求.
    //		3. consumes属性配置为必选.
    //		4. 代表参数载体对象的params字段, 不能存在继承关系, 所有字段都必须直接定义在KDeployParams中. 如果存在基类, 那么处理流程中,只有在`KDeployParams`中直接定义的字段才能被正确解析并传递给服务端,基类的字段不会被feign解析传递. 
	@PostMapping(value = "/projectB/postWithFormData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
	String postWithFormData(@RequestPart("file") MultipartFile file, @RequestPart KDeployParams params);
    
    // =============================================== 对应的服务端 
    //	注意事项:
    //		1. 第二个参数params前面没有任何注解, 或者使用@ModelAttribute。千万不要使用@RequestPart.
	@PostMapping("/projectB/postWithFormData")
	public String postWithFormData(@RequestPart(required = false, name = "file") MultipartFile file,
			KDeployParams params) throws InterruptedException, IOException { ... }    
    

3. 原理解析

分为两部分 —— 发送端的feign,以及服务端的SpringMVC。

3.1 feign端序列化参数

整条请求链路中,feign端的调用层级最终会来到位于feign-form-xx.jar中的MultipartFormContentProcessor.process (...)
在这里插入图片描述

3.2 SpringMVC服务端解析参数

针对上文例子中,在服务端接收层面,SpringMVC中负责传递过来的参数还原/反序列化为KDeployParams的是ServletModelAttributeMethodProcessor(该类实现了大名鼎鼎的HandlerMethodArgumentResolver)。

3.3 补充 - 继承关系不会被传递的原因

PojoUtil的坑,下面这里只会检索出当前类直接声明的字段
在这里插入图片描述

3.4 补充 - 不能使用GET

否则报如下错误:
在这里插入图片描述

4. 补充样例 - 上传文件时使用非MultipartFile类型作为方法参数

// =============================== 方法一
// 1. 注意注解依然得是@RequestPart.
// 2. 处理File类型的源码为: SingleFileWriter.java
// 3. 使用样例: 略
@PostMapping(value = "/projectB/postWithFormData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String postWithFileParams(@RequestPart("file") File file, @RequestPart KDeployParams params);

// =============================== 方法二
// 1. 注意注解依然得是@RequestPart.
// 2. 处理FormData类型的源码为: FormDataWriter.java
// 3. 使用样例:  feignDemo.postWithFileParams3(new FormData("application/octet-stream", "121.txt", FileUtil.readBytes(file)), kDeployParams));
// 4. 参考自: https://stackoverflow.com/questions/56526236/upload-data-file-as-byte-array-with-feign
@PostMapping(value = "/projectB/postWithFormData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String postWithFileParams3(@RequestPart("file") FormData file, @RequestPart KDeployParams params);	

// =============================== 注意:
// 1. 服务端代码不需要变化, 依然使用 MultipartFile类型进行接收。

5. 总结

神在细节之中。

细节是魔鬼。

在Spring Cloud中,如果你想通过Feign客户端上传文件,通常会涉及到处理multipart/form-data类型的请求。为了支持这种文件上传功能,你需要引入两个相关的库: 1. `feign-form`:这是一个Feign的扩展,它允许你发送表单数据,包括文件上传。这个库处理了HTTP请求的编码和解码,使得文件上传变得简单。 2. `spring-web` 或 `spring-webmvc`:虽然Feign本身并不直接包含文件上传的功能,但是Spring Web或Spring MVC的MultipartResolver组件可以配合`feign-form`使用,处理文件上传到服务器。 为了在项目中添加这两个依赖,你需要将它们添加到你的构建工具(如Maven或Gradle)的pom.xml或build.gradle文件中。以下是Maven示例: ```xml <dependencies> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-form</artifactId> <version>9.7.0</version> <!-- 根据实际版本替换 --> </dependency> <!-- 如果使用的是Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 或者如果是纯Spring应用 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> </dependencies> ``` 然后,在你的Feign客户端配置中,启用对multipart的支持,并指定一个MultipartEncoder。例如,如果你使用的是Feign的拦截器机制,可以在`@FeignClient`注解的配置里设置: ```java @Configuration public class FeignConfiguration { @Bean public RequestInterceptor fileUploadRequestInterceptor() { return new RequestInterceptor() { @Override public void apply(RequestTemplate request) { // 设置MultipartEncoder request.setContentType("multipart/form-data"); } }; } @Bean public Client feignClient() { return Feign.builder() .encoder(new FormEncoder()) .requestInterceptors(fileUploadRequestInterceptor()) .target(MyApi.class, "http://your-api-url"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值