问题重现
最近在试用 VS Code 的 RestClient 插件,当提交使用 POST 上传文件时,出现 Required request part 'file' is not present 的错误。
环境
restclient 插件为 : humao.rest-client,其图标如下 接口由spring-boot 提供,代码如下:
@RestController
@RequestMapping("/rest-client")
public class RestClientController {
@PostMapping("/post/file")
public Map<String, Object> upload(@RequestParam("file") MultipartFile file) {
Map<String, Object> resultMap = buildRestMap();
resultMap.put("msg", "上传文件成功!");
resultMap.put("fileName", file.getOriginalFilename());
resultMap.put("fileSize", file.getSize());
return resultMap;
}
private Map<String, Object> buildRestMap() {
return new HashMap<>();
}
}
分析
根据报错 Required request part 'file' is not present 含义,请求中的file参数没有实例,即没有完成参数绑定。
通过实验,可能出现该错误的地方有如下几处:
- 没有传参。这种是因为即使在接口参数前标注了
@RequestParam ,但是在请求中没有传参,在GET、PUT、DELETE中都会发生。 - 文件上传请求中没有指定将文件绑定到那个参数,或者参数绑定与接口需要的不一致。如本例中,接口将文件参数绑定到了
file 。客户端请求时,就应该将文件绑定到该字段,即请求体描述应该这样写
Content-Disposition: form-data; name="file"; filename="tmp01.txt"
- 文件上传请求格式不对。格式不对 RestClient提交的数据就不对,导致接口解析的数据也就不对。
在 humao.rest-client 中,文件上传的格式如下:
POST {file-upload-url}
Content-Type: multipart/form-data; boundary=WebAppBoundary
--WebAppBoundary
Content-Disposition: form-data; name="{文件接受参数}"; filename="{文件名}"
< D:\tmp\tmp01.txt
--WebAppBoundary--
注意: 空行!!!空行!!!
解决
最终使用如下接口文件请求成功
POST http://localhost:8080/rest-client/post/file
Content-Type: multipart/form-data; boundary=WebAppBoundary
--WebAppBoundary
Content-Disposition: form-data; name="file"; filename="tmp01.txt"
< D:\tmp\tmp01.txt
--WebAppBoundary--
请求结果:
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sat, 18 Jun 2022 01:11:20 GMT
Connection: close
{
"msg": "上传文件成功!",
"fileName": "tmp01.txt",
"fileSize": 279936
}
总结
humao.rest-client 是众多 Rest Client 实现中的一种,humao.rest-client是其中最流行的一个。 本文介绍了VSCode中的使用。
在IntelliJ IDEA 2021.1.1 (Ultimate Edition) \ Build #IU-211.7142.45, built on April 30, 2021中默认也集成了该工具,其效果如下: 目前 Rest Client 的实现非常多,VScode 插件的实现就有300多款款,有些直接提供了更易操作的GUI界面,下图是 VsCode 插件库中搜索到的 Rest Client 工具。
许多主流浏览器插件也有对Rest Client 的实现,如下图是微软 Edge 插件中对RestClient 的实现。
|