当返回类型为 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,为啥?