当返回类型为 void 时,为啥 Spring RestController POST 方法返回 200 而不是 204?

Posted

技术标签:

【中文标题】当返回类型为 void 时,为啥 Spring RestController POST 方法返回 200 而不是 204?【英文标题】: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默认不这样做?有什么特别的原因吗?

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

【问题讨论】:

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

【讨论】:

以上是关于当返回类型为 void 时,为啥 Spring RestController POST 方法返回 200 而不是 204?的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC @Controller中返回值为void类型

Spring MVC @Controller中返回值为void类型

为啥 Spring 安全身份验证返回 Null 身份验证对象?

当列表分页的大小输入设置为大于 15 时,Spring Data PagedListHolder 没有返回正确的 PageSize,为啥?

为啥将返回类型添加到 void 返回方法会导致 MissingMethodException

为啥我无法在具有 void 返回类型的异步函数中捕获异常?