项目场景:
在微服务项目中,会使用到openFegin来调取其他服务的接口。公司使用的微服务文件上传接口因为部署在线上,而自己本地测试时不方便,遇到上传文件时报错无法快速定位
问题描述:
公司文件上传的服务器是FTP,给出的接口是@Service
@FeignClient(name="file-system",configuration= FeignSupportConfig.class, fallback= FileUploadFeignServiceFallback.class)
public interface FileUploadFeignService{/**
* 远程调用服务,上传文件
* @return
*/
@PostMapping(value="/file/upload-and-back-merge/{fileStrategy}", produces={MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes= MediaType.MULTIPART_FORM_DATA_VALUE)
ResultfileUpload(@RequestPart("file") MultipartFile file,
@RequestParam("fileName") String fileName,
@RequestParam("md5") String md5,
@RequestParam("size")long size,
@RequestParam(name="chunks", required= false) Integer chunks,
@RequestParam(name="chunk", required= false) Integer chunk,
@PathVariable(name="fileStrategy") String fileStrategy) throws Exception;}
我在本地测试时直接使用fegin name来调用是不通的
原因分析:
openFeign调用远程服务器也可以在本地进行1.@FeignClient的name可以调用同一个注册中心的微服务,直接使用该微服务的别名调用
2.@FeignClient的url可以远程调用执行服务器上的微服务,url可以为http:/{url}/path格式,此时name只为名字
3.@FeignClient的path,当url存在时,完整路径为url+path
4.@FeignClient,当name和path存在,url不存在时,完整路径为 name+path,自动拼接http://
可见:这位博主写的不错
解决方案:
根据上述openFegin的使用规则,我在代码中改为:@Service@FeignClient(name="file-system",url="https://xxx",path="file-system",configuration=FeignSupportConfig.class, fallback=FileUploadFeignServiceFallback.class)publicinterfaceFileUploadFeignService{/**
* 远程调用服务,上传文件
* @return
*/@PostMapping(value="/file/upload-and-back-merge/{fileStrategy}", produces={MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes=MediaType.MULTIPART_FORM_DATA_VALUE)ResultfileUpload(@RequestPart("file")MultipartFile file,@RequestParam("fileName")String fileName,@RequestParam("md5")String md5,@RequestParam("size")long size,@RequestParam(name="chunks", required=false)Integer chunks,@RequestParam(name="chunk", required=false)Integer chunk,@PathVariable(name="fileStrategy")String fileStrategy)throwsException;
该接口参数为MultipartFile,文件上传时本地生成的file转为MultipartFile,我在百度上找了一个工具类,但是很显然该工具类有问题,调用接口报400,下面贴一下file转MultipartFile的代码
FileInputStream inputStream=newFileInputStream(file);MultipartFile multipartFile=newMockMultipartFile("file", file.getName(),ContentType.MULTIPART_FORM_DATA.toString(), inputStream);