处理 JSON 负载和图像数据

Handling JSON payload and image data

我有一个标准的控制器方法来响应 /products 路由中的 POST 请求:

@PostMapping(value = "/products")
public ResponseEntity<ResponseMessage> postProduct(@RequestBody ProductUpsertRequestBody postRequest)
{
   .
   .
   .

ProductUpsertRequestBody 只是一个简单的 class,我用它来捕获 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<ResponseMessage> postProduct(@RequestBody ProductUpsertRequestBody postRequest, @RequestParam MultiPartFile myImage)
    {
      .
      .
      .
    

但我对如何调用此控制器方法感到困惑。使用 HTML 表单制作一个基本的前端并不难,它可以上传任意数量的图像,但随后我失去了发送 JSON 有效载荷的能力(这是一个 REST API,我通过 Swagger 2.9、Postman 向它发送请求,实际上是 curl 调用)。我如何将二进制图像上传与 JSON 有效负载结合起来,以便我的控制器可以捕获它?也许同样重要的是,有没有办法让我通过 Swagger 或 Postman 执行此操作,以便我可以对我的 API?

进行端到端测试

这就是为什么您有多个部分的请求,这个想法是您发送多个独立的部分,每个部分都有自己的内容类型。

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());
    }
}

要对此进行测试,您可以使用邮递员,它也支持此类请求