204 是什么
204 No Content 表示请求成功但响应没有内容:常用于修改或删除成功之后,服务端不需要回传任何数据。它属于成功类别,但有一个必须遵守的约束——不得携带响应体,也不应出现描述报文长度的头部。它的价值在于让「成功且无输出」这件事有个明确的表达,客户端据此知道不必解析内容,也不会因为拿到空内容而报错。
基本信息
| 名称 | 204 No Content,定义见成功响应相关章节 |
|---|---|
| 作用 | 成功且无响应体 |
| 头部约束 | 不得包含描述报文长度与传输方式的头部 |
| 典型场景 | 修改、删除成功;不需要回传数据的操作 |
| 客户端处理 | 不要尝试解析响应体 |
典型使用场景
- 删除成功:服务端不需要回传被删对象
- 修改成功:客户端已有最新数据,不必回传
- 状态切换:启用、禁用、标记已读这类动作
- 幂等操作重复执行:第二次同样返回无内容表示结果一致
- 心跳与预检:只需要一个明确的成功信号
删除成功返回无内容
删除成功返回无内容
curl -si -X DELETE https://api.example.com/users/101 # 预期只看到状态行与少量头部
curl -si -X PATCH https://api.example.com/users/101 -H 'Content-Type: application/merge-patch+json' -d '{}' # 修改成功同样可用无内容码
# 脚本里判断成功时按状态码分支,不要对无内容的响应调用解析使用时的三条约束
| 约束 | 原因 |
|---|---|
| 不得带响应体 | 带内容属于协议违规,部分客户端会把多余内容当作下一个响应的开头 |
| 不应带报文长度头 | 没有内容就没有长度可声明 |
| 客户端不要解析内容 | 对空响应解析会直接抛异常 |
排查要点
- 前端调用后报解析错误,先确认该接口是否返回了无内容码
- 框架自动补上长度头或空响应体时,属于兼容性问题,需要显式关闭
- 网关或代理改写响应时可能破坏约束,排查要用命令行确认原始响应
修改或删除成功时,如果客户端确实需要知道最新状态,应当改用能返回内容的状态码,而不是在无内容码上硬塞数据。语义清晰比省一次请求更重要。
在无内容响应后面附加响应体属于协议违规:某些客户端会把多出来的内容当作下一个响应的开头,在连接复用的场景下可能造成响应错位,属于需要严肃对待的兼容性问题。