如何通过与spring boot Rest相同的方法支持multipart/form-data和application/json

问题描述 投票:0回答:2

我有一个 POST 方法,需要同时支持 multipart/form-data 和 application/json。

即消耗 = { MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE }

当我支持Multipart请求时,我需要一个multipart文件和一个multipart json,可以通过如下声明来获取:

1号线->

@RequestPart("file") MultipartFile file, @RequestPart("jsonString") InputJsonVO inputJsonVO

同样,当支持 application/json 时,我需要接受整个正文作为 Json 内容:

2 号线 ->

@RequestBody InputJsonVO inputJsonVO

当我们有第 1 行或第 2 行时,它可以正常工作,但不能同时使用与参数相同的方法。

`@PostMapping(path = "/multipart", consumes = { MediaType.MULTIPART_FORM_DATA_VALUE,
            MediaType.APPLICATION_JSON_VALUE })
    public String getMessage(@RequestPart(required=false, name="file") MultipartFile file, @RequestPart(required=false, name="jsonString") InputJsonVO inputJsonVO,
            @RequestBody(required=false) InputJsonVO inputJsonVO2
            )` 

如果我发送 POST 请求,则使用此方法声明:

POST /multipart HTTP/1.1
Host: localhost:8080
content-type: application/json
Content-Length: 335

<A Valid Json>

这个效果很好。

但是当我从邮递员发送如下 POST 请求时,它不起作用:

POST /multipart HTTP/1.1
Host: localhost:8080
Content-Length: 650
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="/C:/Users/sdamarla/Downloads/J867FE94.jpeg"
Content-Type: image/jpeg

(data)
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="jsonString"
Content-Type: application/json

<A valid Json>

----WebKitFormBoundary7MA4YWxkTrZu0gW

给出以下错误:

Content type 'multipart/form-data;boundary=--------------------------335202067624768397899751' not supported]

注意:当删除@RequestBody和相应的参数时,多部分请求工作正常。

请告诉我这是否是一个有效的用例,如果是,我在哪里失败了。

spring-boot rest multipartform-data
2个回答
0
投票

只需定义两种不同的方法,一种用于每种表示:

@PostMapping(path = "/multipart", consumes = MediaType.APPLICATION_JSON_VALUE)
public String getMessage(@RequestBody InputJsonVO inputJsonVO) {
    getMessage(null, inputJsonVO);
}

@PostMapping(path = "/multipart", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public String getMessage(@RequestPart MultipartFile file, @RequestPart InputJsonVO inputJsonVO) {
    // your code here
}

0
投票

不重复: @PostMapping(path = "/multipart", 消耗 = { MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE })

© www.soinside.com 2019 - 2024. All rights reserved.