我在Spring Bot Controller中使用HttpStatus.OK
处理所有请求,但我意识到返回正确的Http状态是很好的,于是开始使用以下代码:
GET --> Ok
POST -> Created
PUT --> Ok ???
DELETE --> NoContent ???
但是我不太确定PUT和DELETE,有些人建议用NoContent来删除,用Ok来放,但是我很困惑,不知道哪一个合适。
那么,PUT和DELETE应该使用哪种状态码呢?下面是DELETE的一个用法示例,但我不确定当状态码为NoContent时是否可以返回body(它有意义吗?)
@DeleteMapping("/categories/{id}")
public ResponseEntity<ApiResponse<CommandResponse>> deleteById(@PathVariable long id) {
final CommandResponse response = categoryService.deleteById(id);
return ResponseEntity
.status(HttpStatus.NO_CONTENT)
.body(new ApiResponse<>(Instant.now(clock).toEpochMilli(), SUCCESS, response));
}
**更新:**根据情况,我认为以下实现是可以的:
第一名:
@DeleteMapping("/categories/{id}")
public ResponseEntity<ApiResponse<Void>> deleteById(@PathVariable long id) {
categoryService.deleteById(id);
return ResponseEntity.ok(new ApiResponse<>(Instant.now(clock).toEpochMilli(), SUCCESS));
}
第二名:
@DeleteMapping("/categories/{id}")
public ResponseEntity<ApiResponse<Void>> deleteById(@PathVariable long id) {
categoryService.deleteById(id);
return ResponseEntity
.status(HttpStatus.NO_CONTENT)
.build();
}
3条答案
按热度按时间vqlkdk9b1#
204(无内容)响应不应包含正文;“No Content”意味着 * 没有内容 *。204是DELETE响应的标准(当然是当它成功时),但我也看到200 OK。
对于成功的PUT请求,通常会返回一个200响应状态,并以更新的资源(实体等)作为主体,这样客户端就不必为了获取更新的资源而再次向服务器执行GET。
顺便说一下,Spring提供了一个注解来指定响应状态代码,这样您就不必在代码中写得那么冗长了。
p5cysglq2#
如Http协议RFC 2616中所述
9.6看跌期权
如果修改了现有资源,则应发送200(OK)或204(No Content)响应代码以指示请求成功完成。
还有
9.7删除
如果响应包括描述状态的实体,则成功响应应该是200(OK),如果动作尚未制定,则成功响应应该是202(接受),或者如果动作已制定但响应不包括实体,则成功响应应该是204(无内容)。
编辑:为了澄清,删除操作中描述状态200(OK)的部分需要一个实体,该实体不是实际删除的业务或不在数据库中,而是另一个能够描述删除操作状态(DONE、PENDING、FAILED...)的对象实体。
wkyowqbh3#
对于PUT
对于删除
有关详细信息,请访问Mozilla docs