处理json负载和图像数据

igsr9ssn  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(284)

我有一个标准的控制器方法来响应 /products 路线:

@PostMapping(value = "/products")
public ResponseEntity<ResponseMessage> postProduct(@RequestBody ProductUpsertRequestBody postRequest)
{
   .
   .
   .
``` `ProductUpsertRequestBody` 只是一个简单的类,我用它来捕获json负载:

public class ProductUpsertRequestBody implements Serializable
{
@JsonProperty("id") private String clientProductId;
@JsonProperty("product_name") private String productName;
@JsonProperty("product_type") private String productType;
@JsonProperty("cost_in_cents") private Long costInCents;
@JsonProperty("description") private String description;
@JsonProperty("label_color") private String labelColor;
.
.
.

我需要用一个 `MultiPartFile` 参数,将其转换为:

@PostMapping(value = "/products")
public ResponseEntity postProduct(@RequestBody ProductUpsertRequestBody postRequest, @RequestParam MultiPartFile myImage)
{
.
.
.

但我对如何调用这个控制器方法感到困惑。用一个html表单创建一个基本的前端并不难,它可以上传任意多的图片,但是我失去了发送json负载的能力(这是一个RESTAPI,我通过swagger 2.9,postman,有效地发送请求) `curl` 电话)。如何将二进制图像上传与json负载结合起来,以便我的控制器能够捕获它?也许同样重要的是,有没有一种方法可以让我通过swagger或postman来实现这一点,这样我就可以对我的api进行端到端的测试?
voj3qocg

voj3qocg1#

这就是为什么你有多个部分的要求,这个想法是你发送多个独立的部分,每一个都有自己的内容类型。
Spring Boot支持开箱即用的这种情况。下面是一个例子:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping(path = "/multi")
public class MultipartController {

    private static final Logger LOG = LoggerFactory.getLogger(MultipartController.class);

    @PostMapping
    public void upload(@RequestPart(name = "user") User user, 
            @RequestPart(name = "my-file") MultipartFile file) {
        LOG.info("User name: {}", user.getName());
        LOG.info("File size: {}", file.getSize());
    }
}

为了测试这一点,您可以使用postman,它也支持这种请求

相关问题