项目场景:
在微服务项目中,会使用到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)
Result fileUpload(@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)
public interface FileUploadFeignService {
/**
* 远程调用服务,上传文件
* @return
*/
@PostMapping(value = "/file/upload-and-back-merge/{fileStrategy}", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Result fileUpload(@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;
该接口参数为MultipartFile,文件上传时本地生成的file转为MultipartFile,我在百度上找了一个工具类,但是很显然该工具类有问题,调用接口报400,下面贴一下file转MultipartFile的代码
FileInputStream inputStream = new FileInputStream(file);
MultipartFile multipartFile = new MockMultipartFile("file", file.getName(),
ContentType.MULTIPART_FORM_DATA.toString(), inputStream);