【问题标题】:How to send @Requestbody and @Requestpart together in spring如何在春季同时发送@Requestbody 和@Requestpart
【发布时间】:2019-03-31 00:12:12
【问题描述】:

我想使用 curl 在控制器中一起传递 json 和文件。我在控制器中有以下方法。

@PostMapping(value = /api/campaign, headers = {"content-type=multipart/mixed","content-type=multipart/form-data"})
    @ResponseBody
    @ResponseStatus(HttpStatus.CREATED)
    public @Valid ResponseDTO campaignCreator (@Valid @RequestBody CampaignCreatorDTO campaignCreatorDTO, @RequestPart("file") MultipartFile adGraphic){
}

下面是 curl 命令

curl -i -X POST -H "Content-Type: multipart/mixed" -d "campaignCreatorDTO={\"edipi\":123456789,\"firstName\":\"John\",\"lastName\":\"Smith\",\"email\":\"john.smith@gmail.com\"};type=application/json" -F "file=@newfile.png;type=image/png"  http://localhost:8080/api/campaign

控制器方法没有被调用。 当我将 json 放入文件中并在 curl 命令中使用 file 代替直接 json 时,它可以工作。 但我不想将文件用于 json。

我尝试将 @RequestPart 用于 json 对象但同样的问题。

有没有办法在 json 中传递多部分文件,我的意思是 CampaignCreatorDTO 对象?

更新:: 现在我可以为这两种类型传递 RequestPart,但图像大小将变为 0 字节。虽然 iamge 存在于文件系统中。

更新代码:: 现在使用下面的代码,并将文件大小设为 0 字节。

@PostMapping(value = /api/campaign, consumes = {"multipart/form-data","multipart/mixed"})
    @ResponseBody
    @ResponseStatus(HttpStatus.CREATED)
    public @Valid ResponseDTO campaignCreator (@Valid @RequestPart("json") CampaignCreatorDTO campaignCreatorDTO, @RequestPart("file") MultipartFile adGraphic) {
}

我尝试了此链接中给出的解决方案,但仍然是同样的问题

Spring MVC Multipart Request with JSON

这是客户端向服务器发送数据的方式

let formData = new FormData()

const blob = new Blob([json], {
type: 'application/json'
});

formData.append("json", blob)
formData.append("file", values.adCreativeImageCover)

let authToken = sessionStorage.getItem("authToken")

fetch(/api/campaign, {
method: "POST",
headers: {
'Accept': 'application/json',
'X-Auth-Token': authToken,
},
mode: 'cors',
body: formData
})

【问题讨论】:

  • 您的请求不能同时是multipart/form-dataapplication/json。您可以使用两个请求来完成,也可以使用请求参数发送 json
  • 你只需要将你的 json 编码(到 URL 兼容的格式,例如 URL 编码)或你的文件(到 base64 字符串之类的东西)并在服务器上解码
  • @SumeshTG 做同样的事情,但文件大小仍然为 0 字节。
  • @Anjali 您的请求正文应该有 formData 而不是 JSON。

标签: spring spring-mvc spring-boot curl


【解决方案1】:

我通过在配置中实现 multipartresolver 解决了这个问题。

@Bean
    public MultipartResolver multipartResolver() {
        return new StandardServletMultipartResolver();
    }

【讨论】:

  • 嘿,你能解释一下吗?我也面临同样的问题
  • 看到零赞成票并不奇怪。需要更多详细信息
  • 添加详细信息。它不完整。
【解决方案2】:

第一种方式: 如果您将使用 postman/javaScript 框架 -> 您必须定义每个 RequestPart 的媒体类型。邮递员中的示例:

第二种方式是实现八位字节流的维护,因为如果请求部分没有内容类型标头,spring默认将其设置为AbstractMessageConverterMethodArgumentResolver.class。 (我正在使用spring-boot-starter-parent 2.4.1 -> spring-webmvc 5.3.2

所以这是我发现的 2 个案例(将响应 JSON 映射到 DTO):

1 个案例(不推荐): 设置对 JSON 转换器的支持:

2 例: 定义新的 Converter 类,它肯定适用于所需的类(在我的情况下是 MDVersionDTO.class),并且当它像 octet-stream 一样时,肯定会实现它,ovveride canRead() 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 2017-01-27
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多