【问题标题】:Why Spring RestController POST method returns 200 instead of 204 when return type is void?当返回类型为 void 时,为什么 Spring RestController POST 方法返回 200 而不是 204?
【发布时间】:2022-01-22 18:21:16
【问题描述】:
@PostMapping(path = "/test")
public void save(Map payload) {
    testService.save(payload);
}

Spring RestController 在上述情况下返回 204 而不是 200。返回类型为无效且没有内容是响应正文。在没有响应正文且处理成功时返回 204 HTTP 代码是一种既定做法。我想知道为什么Spring默认不这样做?有什么特别的原因吗?

我已经知道如何更改默认状态码,所以这不是问题。

【问题讨论】:

  • 你的问题有点误导。你说returns 204 instead of 200,然后why Spring doesn't do that by default??是哪个?
  • 顺便说一下,204 在我看来是一个合理的 HTTP 状态代码。有关 204 HTTP 状态代码的更多信息:“这可能用于,例如,在为 wiki 站点实现“保存并继续编辑”功能时。” Source
  • 顺便说一下,Map(假设java.util.Map)是一个原始类型。不要使用原始类型,始终指定必要的类型参数。在你的情况下,Map<?, ?> 可能会,尽管混合类型的键对我来说看起来很奇怪。

标签: java spring spring-boot spring-mvc


【解决方案1】:

对于“为什么默认不返回状态 204”我没有直接答案,但对我来说默认返回 200(ok)对我来说很有意义,因为状态代码204定义指出

没有为此请求发送的内容,但标头可能是 有用的

然而,在什么都不返回的情况下,没有响应实体,因此也没有有用的标头。

由于 Spring Boot(和一般 Java)如此明确,我们在定义我们想要的行为时也需要明确。

您的端点方法的稍微更明确的版本可能类似于以下内容...

@PostMapping("test")
public ResponseEntity<?> save(@RequestBody Map<?,?> payload) {
    if(payload.isEmpty())
        return ResponseEntity.noContent().build();
    else
        return ResponseEntity.ok().body(testService.save(payload));
}

【讨论】:

    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多