前言

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)来注解标识。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐