状态码:4xx 客户端错误
400–451 每个码的精确触发条件,以及易混对(401/403、400/422、409/412)的判定标准。
4xx 表示请求有问题,除响应 HEAD 外 SHOULD 带解释性消息体。服务端 SHOULD 在无法确定客户端能否理解时保守选择更通用的码。
400 Bad Request
请求本身语法或成帧有误,服务端无法或拒绝处理。
明确要求返回 400 的场景(均为 MUST 级):
- 缺少
Host,或多于一个Host。 - 字段名与冒号间有空白。
- 多个不一致的
Content-Length。 - 请求中
Transfer-Encoding的最后一个编码不是chunked。 - 收到 obs-fold(非
message/http场景)。 PUT带Content-Range。
误用警告:业务校验失败(字段值不合法但报文语法正确)不该返回 400——应用 422。400 属于「报文层」错误。
401 Unauthorized
未认证或认证凭据无效。
- MUST 带
WWW-Authenticate字段给出挑战,否则违反规范(客户端无从得知该怎么认证)。 - 客户端可携带
Authorization重试。
与 403 的判定标准:401 = 我不知道你是谁(换个身份可能行);403 = 我知道你是谁,但你不行(换凭据没用)。
402 Payment Required
保留码,无标准语义。部分 API 用于配额/欠费,非标准用法。
403 Forbidden
服务端理解请求但拒绝授权,且重新认证无济于事。
- 与
401的区别见上。 - 若不想暴露资源存在性(避免枚举),SHOULD 返回
404而非403。 - 不必带
WWW-Authenticate。
404 Not Found
无匹配的目标资源,且不透露该情况是暂时还是永久。默认可缓存——需注意误缓存。
405 Method Not Allowed
方法被目标资源禁止。MUST 带 Allow 列出允许的方法。与 501 的区别见方法。
406 Not Acceptable
按请求的主动协商字段(Accept 等)找不到可接受的表示。
- 规范允许服务端忽略协商失败直接返回其首选表示,这在实践中更常见——
406会让客户端彻底拿不到内容。 - 返回
406时 SHOULD 在体中列出可用表示。
407 Proxy Authentication Required
同 401,但针对代理。MUST 带 Proxy-Authenticate;客户端用 Proxy-Authorization 重试。这组字段是逐跳的。
408 Request Timeout
客户端在服务端愿意等待的时间内未发完请求。
- SHOULD 带
Connection: close。 - 与
504无关(那是网关等上游超时)。
409 Conflict
请求与目标资源当前状态冲突,且冲突可能由客户端自行解决。
- 典型:版本冲突、并发编辑、
DELETE一个非空容器。 - 体 SHOULD 说明冲突原因以便客户端修正后重试。
- 与
412的区别:412是客户端显式给了前置条件且未满足;409是资源自身状态不允许,无关前置条件。
410 Gone
资源曾经存在、已永久移除,且无转发地址。默认可缓存。
与 404 的区别纯粹是「是否愿意承诺永久性」。不确定时用 404。
411 Length Required
服务端拒绝无 Content-Length 的请求。客户端补上该字段后可重试。若客户端用了 chunked 而服务端不支持,也走这个码。
412 Precondition Failed
一个或多个条件请求前置条件求值为假(如 If-Match 的 ETag 不匹配)。
用于乐观并发控制:客户端带 If-Match: "v1" 提交,资源已变为 "v2" 时返回 412,避免丢失更新。
413 Content Too Large
请求体超出服务端愿意或能够处理的上限。
- 若是暂时性限制,SHOULD 带
Retry-After。 - 曾名
Payload Too Large(RFC 7231)与Request Entity Too Large(RFC 2616)。
414 URI Too Long
request-target 超长。默认可缓存。常因把大量数据塞进 query 触发——改用 POST。
415 Unsupported Media Type
请求体的格式不被目标资源支持。
- 因
Content-Type不支持 → SHOULD 带Accept列出支持的类型。 - 因
Content-Encoding不支持 → SHOULD 带Accept-Encoding。 PATCH的补丁格式不支持也用此码,可配Accept-Patch。
416 Range Not Satisfiable
Range 中所有范围都超出当前表示长度。
- SHOULD 带
Content-Range: bytes */<完整长度>告知实际长度。 - 注意:若部分范围可满足,服务端应返回
206而非416;无法满足时也可直接忽略Range返回200。
417 Expectation Failed
Expect 字段中的期望无法被满足(含服务端不认识的期望值)。
418 I'm a Teapot
RFC 2324(愚人节玩笑协议 HTCPCP)。不是 HTTP 状态码,IANA 已将 418 保留以防误用。生产勿用。
421 Misdirected Request
请求被发到无法产生响应的服务器——该服务器未被配置为该 authority 提供服务。
主要场景:HTTP/2 连接复用时,客户端复用了一条 TLS 连接向不同 authority 发请求。客户端收到后 MAY 换新连接重试。
422 Unprocessable Content
语法正确、Content-Type 支持,但语义上无法处理(业务校验失败)。
这是 API 返回参数校验错误的正确码,不是 400。RFC 4918 引入,RFC 9110 已纳入核心。
423 / 424 / 425 / 426
| 码 | 名称 | 语义 |
|---|---|---|
423 | Locked | WebDAV,资源被锁定 |
424 | Failed Dependency | WebDAV,依赖的前序操作失败 |
425 | Too Early | RFC 8470,拒绝处理 TLS 早期数据(0-RTT)中的请求,防重放 |
426 | Upgrade Required | 必须升级协议。MUST 带 Upgrade 字段 |
428 Precondition Required
RFC 6585。服务端要求请求必须带前置条件——强制客户端使用 If-Match 以避免丢失更新。
429 Too Many Requests
RFC 6585。超出速率限制。SHOULD 带 Retry-After。
Retry-After = HTTP-date / delay-seconds两种形式:Retry-After: 120(秒)或 Retry-After: Wed, 21 Oct 2026 07:28:00 GMT。
431 Request Header Fields Too Large
RFC 6585。字段区总量或单个字段过大。可只针对单个超限字段返回,体中应指明是哪个。
451 Unavailable For Legal Reasons
RFC 7725。因法律要求不可用。SHOULD 带 Link 字段(rel="blocked-by")指向实施封锁的实体。与 403 的区别是明确归因于法律而非授权。
下一篇:状态码:5xx 服务端错误。