Spring Boot 为什么带有@GetMapping的Sping Boot 3 RestController需要标头“内容长度:要设置的“0”?

wmomyfyw  于 2023-03-02  发布在  Spring
关注(0)|答案(1)|浏览(237)

My Spring Boot 3 @RestController@GetMapping会以HTTP状态代码400 "bad request"响应,除非HTTP请求包含标头"content-length:0 "。我正在使用spring-boot-starter-parent:3.0.2和所需的库。
我使用Spring RestTemplate编写了一个集成测试来调用我的服务。RestTemplate请求总是包含"content-length:0 "。当我设置JMeter测试并收到"错误请求"响应时,我刚刚遇到此行为。这是因为JMeter在GET请求中不包括内容长度。HTTP 1.1鼓励此行为,因为信息是冗余的。RFC 9110
当请求消息不包含内容并且方法语义不预期这样的数据时,用户代理不应该发送内容长度报头字段。
对我来说,这似乎是Spring Boot 3的错误。但也许我配置错了什么?你能想到引发这个问题的东西吗?

@RestController
@RequestMapping("/v1/myService")
@Component
@Slf4j
class GetServlet {
  @GetMapping(value = "/greeting", produces = "text/plain")
  public ResponseEntity getGreeting() {
    log.debug("Sending greeting");
    return ResponseEntity.ok("Hello world!");
  }
}

删除参数"produces"不会更改服务。

@RestController
@RequestMapping("/v1/myService")
@Component
@Slf4j
class GetServlet {
  @GetMapping(value = "/greeting")
  public ResponseEntity getGreeting() {
    log.debug("Sending greeting");
    return ResponseEntity.ok()
            .contentType(MediaType.valueOf("text/plain"))
            .body("Hello world!");
  }
}
11dmarpk

11dmarpk1#

我发现,我们的项目中有一个Filter实现,它检查内容长度,并在内容缺失时抛出“坏请求”。所以基本上Sping Boot 只是做了我们告诉它的事情。该过滤器旨在改进@PostMapping,但当然,它是全局启用的。

相关问题