HTTP 400 Bad Request

通用的客户端错误:请求本身存在某种问题,服务器不会去猜测具体原因。

HTTP 400 是什么意思

HTTP 400 Bad Request 表示服务器读取了请求,并在做任何实际处理之前就将其判定为无效并拒绝。它是万能的客户端错误:语法错误、参数无效、cookie 损坏,或服务器拒绝处理的请求头。

与 401 或 403 不同,400 与权限无关——请求在到达时就已经是错误的。API 通常会附带一个 JSON 响应体,准确说明具体是哪个字段未通过校验。

400 错误的常见原因

  • 请求体中的 JSON 或 XML 格式错误(多余的逗号、引号错误、负载被截断)。
  • 缺少或无效的查询参数,或未通过服务器端校验的值。
  • 损坏或过大的 cookie——这是大型网站上某个用户持续遇到 400 的典型原因。
  • Content-Type 头设置错误,导致服务器按错误的格式解析请求体。
  • URL 编码错误:查询字符串中未转义的空格、引号或非 ASCII 字符。

作为用户该如何修复

  • 重新加载页面;如果 400 依然存在,请清除该站点的 cookie——损坏的 cookie 是最常见的原因。
  • 检查 URL 中是否有拼写错误,或在复制粘贴过程中被破坏的字符。
  • 尝试使用隐身窗口,以排除浏览器扩展重写请求的可能性。

作为开发者该如何修复

  • 发送前先验证 JSON 负载;记录服务器实际收到的完整请求体。
  • 返回一个说明具体哪个字段无效的响应体——一个空的 400 只会浪费大家排查问题的时间。
  • 检查服务器对请求头和 cookie 大小的限制(例如 nginx 的 large_client_header_buffers)。
  • 如果你的 API 需要区分两者,可用 422 表示格式正确但语义无效的输入。

示例响应

HTTP/1.1 400 Bad Request
Content-Type: application/json

{"error":"validation_failed","field":"email","message":"not a valid address"}

常见问题

400 错误是我作为访客的问题吗?

这通常是由过期的 cookie 或损坏的链接引起的,而不是你做错了什么。为该站点清除 cookie 可以解决大多数情况。

400 和 422 有什么区别?

400 表示请求无法解析或结构上无效;422 表示请求解析没有问题,但未通过语义校验。许多 API 对这两种情况都使用 400。

为什么只有一个用户遇到 400,而其他人都正常?

几乎总是因为该用户浏览器中的 cookie 过大或已损坏,超出了服务器的请求头大小限制。