You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot REST API中如何正确使用ResponseEntity返回状态码与数据?

Spring Boot REST API 中 ResponseEntity 的正确使用方式

一、不同请求类型的 ResponseEntity 处理方案

针对POST、PUT、DELETE、GET四种常见请求,结合REST规范和你的自定义响应封装,对应状态码与ResponseEntity用法如下:

1. POST(创建资源)

创建成功需返回201 Created状态码,同时在响应头Location字段返回新资源的访问URI,ResponseEntity.created()就是专门适配这个场景的方法,后续可通过body()附加自定义响应体。

2. PUT(更新资源)

  • 若更新已存在的资源,成功后返回200 OK,用ResponseEntity.ok()携带更新后的操作结果或资源信息即可。
  • 若业务允许“不存在则创建”的更新逻辑,也可返回201 Created(和POST逻辑一致)。
  • 部分场景可返回204 No Content(无响应体),但结合你的ApiResponse封装,返回200并携带结果对客户端更友好。

3. DELETE(删除资源)

删除成功通常返回204 No Content,无需返回响应体;如果需要给客户端返回删除确认(比如删除的ID、操作状态),也可以返回200 OK并携带自定义响应体。

4. GET(查询资源)

  • 查询到资源:返回200 OK,用ResponseEntity.ok()携带资源数据。
  • 未查询到资源:返回404 Not Found,可通过全局异常处理器捕获自定义的ResourceNotFoundException,自动封装成ApiResponse并返回404状态码。

二、用 ResponseEntity.created() 返回创建记录的ID和数据

ResponseEntity.created()要求传入新资源的URI,但不影响同时返回自定义响应体。可以通过UriComponentsBuilder构造资源访问URI,再调用body()方法设置你的ApiResponse对象,这样既符合REST规范(返回Location头),又能把ID和相关数据返回给客户端。

修改你的POST接口代码示例:

import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import java.net.URI;

@PostMapping("/categories")
public ResponseEntity<ApiResponse<CommandResponse>> create(
            @Valid @RequestBody CategoryRequest request) {
        CommandResponse response = categoryService.create(request);
        // 构造新创建分类的URI,格式为 /categories/{id}
        URI location = ServletUriComponentsBuilder.fromCurrentRequest()
                .path("/{id}")
                .buildAndExpand(response.getId()) // 假设CommandResponse有getId()方法返回创建的ID
                .toUri();
        
        // 返回201状态码,同时设置Location头和自定义响应体
        return ResponseEntity.created(location)
                .body(new ApiResponse<>(Instant.now(clock).toEpochMilli(), SUCCESS, response));
}

补充:PUT和DELETE的示例代码

PUT接口示例

@PutMapping("/categories/{id}")
public ResponseEntity<ApiResponse<CommandResponse>> update(
            @PathVariable Long id,
            @Valid @RequestBody CategoryRequest request) {
        CommandResponse response = categoryService.update(id, request);
        return ResponseEntity.ok(
                new ApiResponse<>(Instant.now(clock).toEpochMilli(), SUCCESS, response));
}

DELETE接口示例(返回204)

@DeleteMapping("/categories/{id}")
public ResponseEntity<Void> delete(@PathVariable Long id) {
        categoryService.delete(id);
        return ResponseEntity.noContent().build();
}

// 若需返回响应体,用200 OK:
@DeleteMapping("/categories/{id}")
public ResponseEntity<ApiResponse<String>> delete(@PathVariable Long id) {
        categoryService.delete(id);
        return ResponseEntity.ok(
                new ApiResponse<>(Instant.now(clock).toEpochMilli(), SUCCESS, "分类ID:" + id + "删除成功"));
}

内容的提问来源于stack exchange,提问作者user21263160

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 12:59:14