问题重现
最近在试用 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;
}
/**
* 构建空Map
*
* @return
*/
private Map<String, Object> buildRestMap() {
return new HashMap<>();
}
}
分析
根据报错 Required request part 'file' is not present
含义,请求中的file参数没有实例,即没有完成参数绑定。
通过实验,可能出现该错误的地方有如下几处:
- 没有传参。这种是因为即使在接口参数前标注了
@RequestParam
,但是在请求中没有传参,在GET、PUT、DELETE中都会发生。 - 文件上传请求中没有指定将文件绑定到那个参数,或者参数绑定与接口需要的不一致。如本例中,接口将文件参数绑定到了
file
。客户端请求时,就应该将文件绑定到该字段,即请求体描述应该这样写
# name 与接口文件接受参数保持一致
# filename 是文件名称,一般填写真实的名称即可,但也可以根据需要改一个名称
Content-Disposition: form-data; name="file"; filename="tmp01.txt"
- 文件上传请求格式不对。格式不对 RestClient提交的数据就不对,导致接口解析的数据也就不对。
在 humao.rest-client
中,文件上传的格式如下:
###
# POST 请求
POST {file-upload-url}
# 请求内容类型
Content-Type: multipart/form-data; boundary=WebAppBoundary
# 请求体 注意⚠️:空一行
--WebAppBoundary
# 描述
Content-Disposition: form-data; name="{文件接受参数}"; filename="{文件名}"
#文件地址 注意⚠️:空一行
< D:\tmp\tmp01.txt
--WebAppBoundary--
注意: 空行!!!空行!!!
解决
最终使用如下接口文件请求成功
###
# POST 请求 上传文件
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 的实现。