如何在多部分/表单数据请求中发送对象而不在 Angular 中转换为字符串
Posted
技术标签:
【中文标题】如何在多部分/表单数据请求中发送对象而不在 Angular 中转换为字符串【英文标题】:How to send Object in a multipart/form-data request without converting to string in Angular 【发布时间】:2020-01-15 22:51:10 【问题描述】:我必须在“multipart/form-data”请求中传递对象,以便它可以在下游应用程序(Java Spring)中作为列表接收,即自定义类对象。元数据对象只包含键和值
在角度
interface Metadata
key:string;
value:string;
在 Angular 中,我使用 FormData 创建多部分请求,如下所示。
metadatas = new Array<Metadata>();
// few values added in metadatas array.
fileToUpload: File ; // contains file information
const formData: FormData = new FormData();
formData.append('file', fileToUpload, fileToUpload.name);
formData.append('metadata',JSON.stringify(this.metadatas))
由于 FormData 追加方法定义中说“值:字符串 | Blob”,所以我需要使用 JSON.stringify() 将我的元数据对象转换为字符串。 但是当我在 Spring 应用程序(下游)中这样做时,我可以接收字符串中的对象,例如
@PostMapping(path = "/file-upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> fileUpload(
@RequestParam(name = "metadata", required = false) String metadata,
@RequestParam(name = "file", required = false) MultipartFile file)
System.out.println(metadata);
System.out.println(file);
return new ResponseEntity<>("example", HttpStatus.OK);
上面的代码正在运行并且能够获取元数据和文件数据,但正如我的 API 所说,它应该在 Java 对象中接收。所以我的 spring 方法定义应该是 List。同样,这里的元数据是包含键和值的对象。
在 Java 中
public class Metadata
private String key;
private String value;
// getter and setters
在下面的代码中,元数据应该被捕获到列表中
@PostMapping(path = "/file-upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> fileUpload(
@RequestParam(name = "metadata", required = false) List<Metadata> metadata,
@RequestParam(name = "file", required = false) MultipartFile file)
System.out.println(metadata);
System.out.println(file);
return new ResponseEntity<>("example", HttpStatus.OK);
我用@RequestPart 和@RequestParam 尝试了不同的方法,但没有任何结果。根据我的理解,我认为当我在从角度发送时将元数据转换为字符串,因此我能够在字符串对象中接收它。
但在 FormData 中,我没有任何选项可以直接附加对象,因为它允许字符串或 Blob。 有没有其他方法可以发送多部分对象而不转换为角度字符串? 或者 即使我们使用 FormData 发送对象,我们如何才能在 Java 类中接收对象,即 Spring Boot 应用程序中的列表?
由于我是新手,请帮助我获得详细解释的解决方案。
【问题讨论】:
【参考方案1】:对我有用的是:
@PostMapping("/upload_pic")
fun uploadPic(@RequestParam(IMAGE) image: MultipartFile?,
@RequestParam(GROUP_ID) groupId: String,
@RequestHeader(DEVICE_ID_HEADER_STRING) deviceId: String,
@RequestHeader(TOKEN_HEADER_STRING) authToken: String): ResponseEntity<StatusModel>
所有注解参数都是String常量。
顺便说一句,这是在 kotlin 中。
【讨论】:
当参数为 String 时,它也适用于我,但我希望我的参数作为 Java 自定义对象,因为 multipart 支持发送对象。但是我在某个地方发现 Angular 2 中的 FormData 限制了以字符串或 Blob 发送多部分请求。以上是关于如何在多部分/表单数据请求中发送对象而不在 Angular 中转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何在邮递员的同一请求中发送多部分/表单数据和嵌套 json?
如何将 UIButton 的 rx_tap 直接转换为网络请求,而不在嵌套订阅中发送请求?
使用 AJAX + 多部分表单数据 + UTF-8 编码发送文件和文本
如何在名册中添加联系人而不在 xmpp 聊天中发送和接受订阅请求