共计 1657 个字符,预计需要花费 5 分钟才能阅读完成。
今天开发项目时,遇到一个需求,需要上传一个 excel 文件到微服务上,微服务是国外同事写的,我负责处理 gateway 和前端部分。在 postman 上测试接口没有问题了,就准备在代码就实现。但是遇到了一个问题,无论怎样都调用不成功。此时前端到 gateway 的调用是成功的,因为我可以把 controller
拿到的数据成功写入到本地。问题就出在 gateway 调用另一个微服务上。
@RequestMapping(value = "/import/excel", method = RequestMethod.POST)
public Object importTableExcel(@RequestParam("file") MultipartFile file, @RequestParam("tableName") String tableName, @RequestParam("importType") String importType) {return ep2LookUpDBFeignClient.importTableExcel(file, tableName, importType);
}
这个是 controller 代码,前端用 formData 封装提交,这里用 MultipartFile 接收。到这一步是没有问题的
@RequestMapping(value = "/api/tables/import/excel",
method = RequestMethod.POST,
produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Object importTableExcel(@RequestParam("file") MultipartFile file,@RequestParam("tableName")String tableName, @RequestParam("importType")String importType);
这个是调用微服务的代码,问题就出在这里。但是我一开始也是百思不得其解,参数设置什么的都没
有问题了,那怎么还会出错了。于是我各种找资料,然后在一篇文中,看到原来是注解写错了,MultipartFile 的注解应该是 @RequestPart,而不是 @RequestParam。改了之后果然可以了。
@RequestMapping(value = "/api/tables/import/excel",
method = RequestMethod.POST,
produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Object importTableExcel(@RequestPart("file") MultipartFile file,@RequestParam("tableName")String tableName, @RequestParam("importType")String importType);
这个是可以成功运行的代码,在此记录一下,以免下次还犯同样的错误。以下是 @RequestParam 和 @RequestPart 的区别
1.@RequestPart 这个注解用在 multipart/form-data 表单提交请求的方法上。2. 支持的请求方法的方式 MultipartFile,属于 Spring 的 MultipartResolver 类。这个请求是通过 http 协议传输的。3.@RequestParam 也同样支持 multipart/form-data 请求。4. 他们最大的不同是,当请求方法的请求参数类型不再是 String 类型的时候。5.@RequestParam 适用于 name-valueString 类型的请求域,@RequestPart 适用于复杂的请求域(像 JSON,XML)。
正文完