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
相关产品推荐
相关产品推荐

