如何为204(NO_CONTENT)响应添加自定义头部及内容?
问题本质
HTTP 204(No Content)的规范明确要求响应体必须为空,所以无论你怎么尝试在204响应中添加响应体,都会被HTTP协议或客户端忽略。你之前添加的响应头没生效,可能是客户端未正确读取响应头,或代码配置存在其他问题,但核心矛盾是204本身不支持响应体。
可行实现方案
方案一:改用200 OK状态码返回响应体
这是最符合HTTP规范的做法,200状态码允许携带响应体:
@ApiResponses(value = { @ApiResponse(responseCode = "200", content = {@Content(schema = @Schema(implementation = String.class))}, description = "Successful") }) @DeleteMapping("/Users/{id}") public ResponseEntity<String> deleteUser(@PathVariable("id") String id) { userService.deleteUser(id); return ResponseEntity.ok("Successfully deleted"); }
方案二:坚持用204,通过响应头传递消息
如果必须保留204状态码,只能通过响应头传递信息,同时要修正Api注解使其符合204的规范(content需为空):
@ApiResponses(value = { @ApiResponse(responseCode = "204", content = {}, description = "Successfully deleted") }) @DeleteMapping("/Users/{id}") public ResponseEntity<Void> deleteUser(@PathVariable("id") String id) { userService.deleteUser(id); return ResponseEntity.noContent() .header("X-Message", "Successfully deleted") // 用标准自定义头前缀X-避免冲突 .build(); }
注意:客户端需要通过读取响应头
X-Message来获取提示信息,而非解析响应体。
方案三:自定义Spring响应处理(不推荐)
如果一定要打破HTTP规范在204中添加响应体,可以通过自定义ResponseBodyAdvice实现,但这种做法可能导致部分客户端(如浏览器、第三方HTTP库)无法正确解析响应,引发兼容性问题:
@ControllerAdvice public class CustomResponseAdvice implements ResponseBodyAdvice<Object> { @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { // 仅对deleteUser方法生效 return returnType.getMethod().getName().equals("deleteUser"); } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { // 设置204状态码并强制写入响应体 response.setStatusCode(HttpStatus.NO_CONTENT); return "Successfully deleted"; } }
再次提醒:此方案违反HTTP标准,谨慎使用。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

