Spring 文档指出 @RequestParam 依赖于通过注册的 Converter 或 PropertyEditor 进行类型转换,而 @RequestPart 依赖于 HttpMessageConverters,同时考虑请求部分的“Content-Type”标头
@RequestParam
:
最适合直接的表单数据提交,您可以在其中上传文件以及其他简单的表单字段。 (例如,字符串、整数)。
将简单的名称-值对转换为方法参数。依赖于通过注册的转换器或 PropertyEditor 进行类型转换。
@RequestParam 需要简单的字符串或表单编码的数据。它无法正确解析复杂的 JSON 结构或将其转换为 Java 对象。我们需要为它们编写自定义逻辑
@PostMapping("/upload2")
public ResponseEntity<String> submitData(
@RequestParam("file") MultipartFile file,
@RequestParam("metadata") String metadata) {
try {
// Convert JSON string to MyObject
ObjectMapper objectMapper = new ObjectMapper();
Metadata myObject = objectMapper.readValue(metadata, Metadata.class);
// Use the parsed object
System.out.println("Key1: " + myObject.getKey1());
System.out.println("Key2: " + myObject.getKey2());
return ResponseEntity.ok("Data received");
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.badRequest().body("Error processing data");
}
@RequestPart
:
当您的请求包含复杂部分时,例如需要单独解析的文件和 JSON 负载。 (例如 JSON 数据)。
处理更复杂的内容,例如 JSON 或 XML。使用HttpMessageConverters根据Content-Type转换请求部分。这可以将 JSON 映射到非多部分请求中的 Java 对象。
@PostMapping(path = "/upload1", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> uploadComplex(
@RequestPart("file") MultipartFile file,
@RequestPart("metadata") Metadata metadata) {
// Use the parsed Metadata object
System.out.println("Key1: " + metadata.getKey1());
System.out.println("Key2: " + metadata.getKey2());
return ResponseEntity.ok("File and metadata uploaded");
}
}