Feign在Github上开源了一个项目,可以更加方便的利用Feign进行文件传输和多参数传输。项目地址:https://github.com/OpenFeign/feign-form这篇文章就结合官方的Test总结下用法。
使用前我们下载pom中引入相关包,其中核心的部分如下所示:
io.github.openfeign.form feign-form xxx io.github.openfeign.form feign-form-spring xxx
最新的版本,大家自己从:http://mvnrepository.com/ 检索吧!
文件上传服务提供方
在web层的核心代码如下所示:@RestControllerpublic class Server { // MultipartFile必须使用 @RequestPart 进行修饰 // consume为: MULTIPART_FORM_DATA_VALUE,表明只接收FormData这个类型的数据 @RequestMapping( value = "/multipart/upload1/{folder}", method = POST, consumes = MULTIPART_FORM_DATA_VALUE) public String upload1(@PathVariable("folder") String folder, @RequestPart MultipartFile file, @RequestParam(value = "message", required = false) String message) { return new String(file.getBytes()) + ':' + message + ':' + folder; }该代码中有需要注意:
必须是Post类型的请求。文件形参必须用@RequestPara MultipartFile file来修饰,其中 @RequestParat和MultipartFile必不可少。形参中有3类参数,实际开发中可以改为对文件的描述信息PathVariable 是在URL占位中的参数RequestPart 是修改文件的参数RequestParam 是URL中?后面的参数。服务调用方Feign接口
@FeignClient( name = "multipart-support-service", url = "http://localhost:8080", configuration = Client.ClientConfiguration.class)public interface Client { //处理多个参数的时候,必须指定:consumes = MULTIPART_FORM_DATA_VALUE @RequestMapping( value = "/multipart/upload1/{folder}", method = POST, consumes = MULTIPART_FORM_DATA_VALUE ) String upload1(@PathVariable("folder") String folder, @RequestPart MultipartFile file, @RequestParam(value = "message", required = false) String message); /** * 配置类 */ class ClientConfiguration { /** * 此处注入的是: ObjectFactory */ @Autowired private ObjectFactory messageConverters; @Bean public Encoder feignEncoder() { return new SpringFormEncoder(new SpringEncoder(messageConverters)); } }}方法中需要注意几个细节:
FeignClient中的描述信息中,指定了配置信息为:Client.ClientConfiguration请求参数形参注意事项同上所示,此处不再赘述。我们来看看配置信息:
/** * 配置类 */class ClientConfiguration { /** * 此处注入的是: ObjectFactory */ @Autowired private ObjectFactory messageConverters; @Bean public Encoder feignEncoder() { return new SpringFormEncoder(new SpringEncoder(messageConverters)); }}这部分代码表述的就是:获取已有的HttpMessageConvert然后将其包裹下,外层增加自己的编码器SpringFormEncoder。该写法是针对某个Feign Client的配置。
如果你的客户端所有的都需要这个配置,那么请通过如下方式配置:
@Configurationpublic class MultipartSupportConfig {@Autowired private ObjectFactory messageConverters;
@Bean @Primary @Scope("prototype") public Encoder feignEncoder() { return new SpringFormEncoder(new SpringEncoder(messageConverters)); }}
该配置中也是细节满满:
通过@Primary修饰,优先注入我们