【问题标题】:Handling JSON payload and image data处理 JSON 有效负载和图像数据
【发布时间】:2021-03-28 12:12:32
【问题描述】:

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

@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<ResponseMessage> postProduct(@RequestBody ProductUpsertRequestBody postRequest, @RequestParam MultiPartFile myImage)
    {
      .
      .
      .
    

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

【问题讨论】:

    标签: java json spring-boot rest multipart


    【解决方案1】:

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

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

    为了测试这一点,您可以使用邮递员,它也支持此类请求

    【讨论】:

    • 我明白了。为了清楚起见,应该使用注解@RequestPart 而不是@PathVariable@RequestParam,是吗?
    • 没错,每个请求部分是指您的多部分表单请求中的一个部分(注意每个名称必须与请求中的名称匹配)。我还添加了我的答案中缺少的导入
    猜你喜欢
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2018-11-23
    • 2013-12-06
    • 2017-02-11
    相关资源
    最近更新 更多