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!");
}
}
1条答案
按热度按时间11dmarpk1#
我发现,我们的项目中有一个Filter实现,它检查内容长度,并在内容缺失时抛出“坏请求”。所以基本上Sping Boot 只是做了我们告诉它的事情。该过滤器旨在改进@PostMapping,但当然,它是全局启用的。