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

标签 java spring spring-boot rest spring-mvc

我在 Spring Bot Controller 中使用 HttpStatus.OK 来处理我的所有请求。但我意识到返回正确的 Http 状态是件好事,并开始使用以下内容:

GET --> Ok
POST -> Created
PUT --> Ok ???
DELETE --> NoContent ???

但我不确定 PUT 和 DELETE,有些人建议使用 NoContent 进行 DELETE,使用 Ok 进行 PUT。但我很困惑,不知道哪个合适。

那么,我应该对 PUT 和 DELETE 使用哪些状态代码?这是我的 DELETE 的示例用法,但我不确定当状态代码为 NoContent 时我们是否可以返回正文(有意义吗?)

@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));
}

更新:根据情况,我认为以下实现是可以的:

#1:

@DeleteMapping("/categories/{id}")
public ResponseEntity<ApiResponse<Void>> deleteById(@PathVariable long id) {
    categoryService.deleteById(id);
    return ResponseEntity.ok(new ApiResponse<>(Instant.now(clock).toEpochMilli(), SUCCESS));
}

#2:

@DeleteMapping("/categories/{id}")
public ResponseEntity<ApiResponse<Void>> deleteById(@PathVariable long id) {
    categoryService.deleteById(id);
    return ResponseEntity
            .status(HttpStatus.NO_CONTENT)
            .build();
}

最佳答案

204(无内容)响应不应包含正文; “无内容”意味着没有内容。 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);
}

关于java - Spring Boot REST API 的 @PutMapping 和 @DeleteMapping 的 HTTP 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75593543/

相关文章:

java - 在新的 ubuntu 机器上安装 jdk/sbt

java - 使用二维数组显示由方法填充的数据

java - 如何在 Web 服务响应中将 json 响应作为 block 返回?

Spring Security Kerberos Extension Gradle Build 问题

hibernate - jpa实体不更新数据库中的关系操作

java - 模糊 TextView 的背景 - IllegalArgumentException 宽度和高度必须 > 0

java - 如何设置我在加载其他 jframe 类时 setvisible(false) 的 JFrame?

java - Spring(规范)-如何创建具有多对多关系和集合的条件生成器

java - 禁用烦人的 PODAM 日志

java - Flyway 可重复迁移 - 不在 Spring boot 中执行