【问题标题】:Spring boot - restTemplate.postForObject - params are null春季启动 - restTemplate.postForObject - 参数为空
【发布时间】:2021-05-06 21:08:43
【问题描述】:

我有 2 个 Spring Boot 应用程序,一个作为前端运行,另一个作为后端服务运行。从前端我对后端服务进行 api 调用,我发送的两个参数都显示为 null。我认为问题出在其余模板中。

更新

所以我注意到如果我省略内容值,那么它会起作用。由于内容是大于 1mb 的文件的内容,我在 application.yml 中添加了以下内容:

spring.servlet.multipart.max-file-size: 10MB
spring.servlet.multipart.max-request-size: 10MB

这是我在本期发布的代码中更新的代码: How to POST form data with Spring RestTemplate?

但我仍然没有在后端控制器中得到值,而是两个值都是空的。

        public void upload(byte[] content, String name) {
        String encodedString = Base64.getEncoder().encodeToString(content);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("fileName", name);
        map.add("content", encodedString);

        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);

        ResponseEntity<String> response = restTemplate.postForEntity(backendUrl + "/upload", request, String.class);
        log.debug("Response from upload: " + response);
    }

这是后端的控制器。文件名和内容均为空:

        @CrossOrigin
    @SneakyThrows
    @ResponseBody
    @PostMapping(value = "/upload")
    public ResponseEntity<String> upload(@ModelAttribute FormModel form) {
        byte[] decodedBytes = Base64.getDecoder().decode(form.getContent());
        uploadService.upload(decodedBytes, form.getFileName());
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.set("Content-Type", "application/json");
        return ResponseEntity.ok().headers(responseHeaders).body("Uploaded");
    }

谁能看看这段代码有什么问题?

提前致谢。

【问题讨论】:

    标签: java spring-boot resttemplate


    【解决方案1】:

    好的,我可以通过发送和接收字节而不是编码为字符串的字节来修复它。 所以在resttemplate中:

        public void upload(byte[] bytes, String name) {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    
            MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
            map.add("fileName", name);
            map.add("bytes", bytes);
    
            HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(map, headers);
            log.debug("map values: " + map.toString());
    
            ResponseEntity<String> response = restTemplate.postForEntity(backendUrl + "/upload", request, String.class);
            log.debug("Response from upload: " + response);
        }
    
    

    在控制器中:

    public ResponseEntity<String> upload(@ModelAttribute FormModel form) {
            byte[] bytes = form.getBytes();
            uploadService.upload(bytes, form.getFileName());
            HttpHeaders responseHeaders = new HttpHeaders();
            responseHeaders.set("Content-Type", "application/json");
            return ResponseEntity.ok().headers(responseHeaders).body("Uploaded");
        }
    

    但最好知道为什么以前的版本不起作用。

    【讨论】:

      【解决方案2】:

      我想问题是您尝试使用restTemplate.postForObject,但使用@RequestParam 而不是@RequestBody

      @RequestParam 中,您期望在查询参数/upload?fileName=&amp;content= 中接收数据。但您实际上是在正文中使用restTemplate.postForObject(backendService+ "/upload", map, String.class); 发送它。

      所以我的建议是改变

      public ResponseEntity&lt;String&gt; upload(@RequestParam(value = "fileName") String fileName, @RequestParam(value = "content") String content)

      public ResponseEntity&lt;String&gt; upload(@RequestBody Map&lt;String, String&gt; body)

      然后从正文中获取文件名和文件内容。

      【讨论】:

      • 您的反应方向正确。我将方法签名更改为@ModelAttribute FormModel 表单。但是对于文件名和内容,我仍然得到空值。
      猜你喜欢
      • 2016-09-13
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 2015-04-18
      • 2017-06-24
      • 2015-08-22
      • 2015-09-18
      相关资源
      最近更新 更多