HTTP 状态码是什么
HTTP 状态码是服务器对请求结果的标准化表达,RFC 9110 将其分为五类:1xx 信息、2xx 成功、3xx 重定向与缓存、4xx 客户端错误、5xx 服务端错误。对测试人员来说,状态码是接口断言的第一层证据:它区分了成功、拒绝与故障三种基本结局,也是排查问题的路标——401 与 403 指向鉴权设计的哪一层、502 与 504 指向哪一跳链路,语义不同,处理方式完全不同。断言时应核对具体状态码与响应结构,而不是笼统地看是否等于 200。
基本信息
| 规范来源 | RFC 9110(HTTP Semantics) |
|---|---|
| 2xx 常用 | 200 成功、201 已创建、204 无内容、206 部分内容 |
| 3xx 常用 | 301 永久重定向、302 临时重定向、304 缓存有效 |
| 4xx 常用 | 400 请求错误、401 未认证、403 无权限、404 不存在、405 方法不允许、409 冲突、422 语义错误、429 限流 |
| 5xx 常用 | 500 内部错误、502 网关错误、503 不可用、504 网关超时 |
| 断言原则 | 区分具体状态码,并校验响应体与关键响应头 |
典型使用场景
- 接口断言精确化:创建返回 201 并校验 Location 头,删除返回 204 并确认无响应体
- 鉴权矩阵测试:未登录断言 401、登录但无权限断言 403,两者不可互相替代
- 并发与重复提交:用 409 验证冲突检测与幂等保护是否生效
- 限流验证:触发 429 并检查 Retry-After 头与恢复时间是否符合配置
- 缓存行为验证:带 If-None-Match 请求断言 304,确认 ETag 协商缓存生效
- 故障定位:502 与 504 区分上游拒绝连接还是上游超时,快速缩小排查范围
curl 观察状态行与响应头
curl 观察状态行与响应头
curl -i -X POST https://api.example.com/orders -d '{"sku":"A-1"}'
# -i 输出状态行与响应头:创建成功应看到 201 Created 与 Location 头
curl -i https://api.example.com/orders/1 -H 'If-None-Match: "abc123"'
# 缓存仍有效时返回 304 Not Modified,且没有响应体
curl -i https://api.example.com/admin/users
# 未带凭证预计 401;带凭证但无权限预计 403常见状态码测试关注点
| 状态码 | 含义 | 测试关注点 |
|---|---|---|
| 200/201/204 | 成功/已创建/无内容 | 201 校验 Location 头;204 校验响应体为空 |
| 301/302 | 永久/临时重定向 | 校验 Location 与后续请求方法是否保持 |
| 304 | 未修改,缓存有效 | 配合 ETag 与 If-None-Match 验证协商缓存 |
| 400/422 | 请求格式错误/语义校验失败 | 错误体应含字段级提示,不可吞细节 |
| 401/403 | 未认证/无权限 | 鉴权矩阵与越权用例必须分开断言 |
| 409 | 资源冲突 | 并发下单与重复提交场景的幂等保护 |
| 429 | 请求过多被限流 | 校验 Retry-After 与窗口恢复行为 |
| 502/503/504 | 网关/服务/网关超时 | 结合上游日志区分连接拒绝与超时 |
401 与 403 是两件事:401 表示缺少或无效凭证(先认证),403 表示凭证有效但权限不足(再授权)。把它们混在一起断言,认证缺陷与授权缺陷会互相掩盖。
304 不是失败:它是协商缓存命中的正常结果,测试应结合响应头(ETag、Last-Modified、Cache-Control)一起断言,确认缓存语义而不仅仅是状态码。
5xx 出现时先做职责划分:500 多为应用自身异常,502 指向上游拒绝或崩溃,504 指向上游超时;结合网关与应用两侧日志的时间戳对齐,能最快定位断点。
错误响应的结构也是接口契约的一部分:4xx 场景应断言错误码字段与提示文案结构,避免前端拿到空响应体无法给出用户提示。
重定向细看方法论:301/302 在历史实现中可能把 POST 改写为 GET,需要保持请求方法时用 307/308;测试重定向场景要同时断言请求方法不变与最终落地地址。