Spring Boot Sping Boot REST API的@PutMapping和@DeleteMapping的HTTP状态?

pcww981p  于 2023-03-02  发布在  Spring
关注(0)|答案(3)|浏览(165)

我在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();
}
vqlkdk9b

vqlkdk9b1#

204(无内容)响应不应包含正文;“No Content”意味着 * 没有内容 *。204是DELETE响应的标准(当然是当它成功时),但我也看到200 OK。
对于成功的PUT请求,通常会返回一个200响应状态,并以更新的资源(实体等)作为主体,这样客户端就不必为了获取更新的资源而再次向服务器执行GET。
顺便说一下,Spring提供了一个注解来指定响应状态代码,这样您就不必在代码中写得那么冗长了。

@DeleteMapping("/categories/{id}")
@ResponseStatus(value = HttpStatus.NO_CONTENT)
public void deleteById(@PathVariable long id) {
    categoryService.deleteById(id);
}
p5cysglq

p5cysglq2#

如Http协议RFC 2616中所述

9.6看跌期权

如果修改了现有资源,则应发送200(OK)或204(No Content)响应代码以指示请求成功完成。
还有

9.7删除

如果响应包括描述状态的实体,则成功响应应该是200(OK),如果动作尚未制定,则成功响应应该是202(接受),或者如果动作已制定但响应不包括实体,则成功响应应该是204(无内容)。

编辑:为了澄清,删除操作中描述状态200(OK)的部分需要一个实体,该实体不是实际删除的业务或不在数据库中,而是另一个能够描述删除操作状态(DONE、PENDING、FAILED...)的对象实体。

wkyowqbh

wkyowqbh3#

对于PUT

  • HTTP状态201(如果条目不存在且已创建)
  • HTTP状态200或HTTP状态204(如果存在条目并已更新)

对于删除

  • HTTP状态200

有关详细信息,请访问Mozilla docs

相关问题