微服务OpenFeign接口调用传输文件的同时传输表单字段

前言

feign在调用服务接口的时候,如果传输的是json,map,list对象等类型数据基本上不会有什么问题,但是如果在传输文件时候如果feign接口注解使用不当就会出错,从而导致服务提供接口的multipart参数为null。

依赖
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

这里使用的是openfeign,这个是spring cloud在feign基础上对springmvc的支持,也就是feign接口上可以使用springmvc的注解。

feign接口
@FeignClient(name = "READINGBOOK")//指定服务
@Component("readingBookServer")
public interface ReadingBookServer {
   	
    @PostMapping(path = "/query/mod", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)//必须指定数据类型
    Response<String> modifyBook(@SpringQueryMap Map<String,Object> map,@RequestPart("img") MultipartFile multipartFile)
            throws IOException;
            //map传递表单字段
            //map不要使用@QueryMap和@Parm注解,因为这两个注解会将字段直接拼接到URl上
            //这里map不能使用@RequestPart注解,不然会出现LinkHashMap不支持解码错误
            //MultipartFile必须使用@RequestPart注解,如果使用@RequestParam 会导致服务提供接口接收不到文件
            
}

服务提供接口
 @PostMapping(path = "/mod", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Response<String> modifyBook(@RequestParam Map<String, Object> book,
                                       @RequestParam(value = "img", required = false) MultipartFile multipartFile)
            throws IOException {
            
        log.info("book={}", book.toString());
        log.info(multipartFile.getOriginalFilename());
        
        return Response.success("成功!");
    }

调用feign接口
@PostMapping("/mod")
    public Response<String> modifyBook(@RequestParam Map<String, Object> book,
                                       @RequestParam(value = "img", required = false) MultipartFile multipartFile)
            throws IOException {
        log.info(book.toString());
        log.info(multipartFile.getOriginalFilename());
        return readingBookServer.modifyBook(book,multipartFile);
    }
测试

在这里插入图片描述
服务调用端
在这里插入图片描述
服务提供端
在这里插入图片描述
可以看见服务提供端成功接受到了文件

总结
  1. @RequestParam 与@RequestPart都支持multipart/form-data表单提交请求的方法上。
  2. feign接口调用服务接口时候,使用@RequestPart来标识文件。
  3. 如果服务间想要在传输文件的同时需要传输formdata的表单字段的话,那么feign接口得到传递的表单字段需要使用 @RequestParam 或者@SpringQueryMap(参数类型是Map)来注解标识。
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值