讲解HTTP 状态码

9 阅读3分钟

HTTP 状态码,它们广泛用于 Java Web 开发中(以及所有基于 HTTP 协议的后端服务),用来表示服务器对客户端请求的处理结果。

HTTP 状态码是标准化的,由三位数字组成,根据第一位数字大致分为 5 大类:

📌 1xx:信息性状态码

  • 主要用于临时响应,表示请求已接收,正在处理。

  • 常用的:

    • 100 Continue:客户端可以继续发送请求的剩余部分。

(1xx 在日常 Java 开发中基本用不到)


📌 2xx:成功状态码

表示请求被服务器成功接收并处理。

  • 200 OK

    • ✅ 最常见,表示请求成功,比如 GET 返回资源、POST 成功创建等。
  • 201 Created

    • 资源已成功创建,常用于 POST 新建操作。
  • 204 No Content

    • 请求成功但没有返回任何内容,比如 DELETE 后。

📌 3xx:重定向状态码

表示需要客户端采取进一步操作才能完成请求。

  • 301 Moved Permanently

    • 永久重定向,比如域名迁移。
  • 302 Found

    • 临时重定向,常用于网站维护。
  • 304 Not Modified

    • 客户端缓存的资源未修改,可以使用本地缓存。

📌 4xx:客户端错误状态码

表示请求有错误,问题出在客户端。

  • 400 Bad Request

    • 客户端请求语法错误、参数错误或无法解析请求体。
  • 401 Unauthorized

    • 未授权,需要认证(如未登录或 token 过期)。
  • 403 Forbidden

    • 已认证,但没有权限访问资源,比如权限不足。
  • 404 Not Found

    • 请求的资源不存在,比如访问了不存在的 URL。
  • 405 Method Not Allowed

    • 请求方法不被支持,比如 POST 到只支持 GET 的接口。
  • 409 Conflict

    • 请求与服务器资源状态冲突,比如并发更新导致版本冲突。

📌 5xx:服务器错误状态码

表示服务器处理请求时出错,问题在服务器端。

  • 500 Internal Server Error

    • 服务器内部错误,常见的 NullPointerException 等未捕获异常。
  • 502 Bad Gateway

    • 作为网关或代理的服务器,从上游服务器接收到无效响应。常见于反向代理(Nginx)连接后端服务失败。
  • 503 Service Unavailable

    • 服务不可用,通常是服务器过载或维护中。
  • 504 Gateway Timeout

    • 网关或代理服务器等待上游服务器响应超时。

✅ 常见状态码总结

状态码含义适用场景示例
200OK请求成功,常见 GET、POST 响应
201Created资源成功创建,比如注册新用户
204No Content删除成功无返回
400Bad Request参数格式错误、不符合 API 约定
401Unauthorized未登录或 token 失效
403Forbidden已登录但无权限访问资源
404Not Found请求地址或资源不存在
405Method Not Allowed请求方法错误,比如用 POST 请求 GET-only 接口
500Internal Server Error后端异常
502Bad Gateway代理服务器连接后端服务失败
503Service Unavailable后端服务器宕机或维护
504Gateway Timeout请求后端超时

📌 Java 开发中如何使用

在 Spring Boot 接口中可以通过返回特定的 HTTP 状态码来表达不同的结果:

@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/user/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        if (user == null) {
            // 返回 404 Not Found
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
        }
        // 返回 200 OK
        return ResponseEntity.ok(user);
    }

    @PostMapping("/user")
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User savedUser = userService.save(user);
        // 返回 201 Created
        return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
    }
}

✅ 小提示

  • 状态码是客户端和服务器沟通的标准语言。
  • 在 Java 后端设计 API 时,合理地返回对应的状态码可以让前端更清楚请求结果,有助于开发和调试。
  • 不要把所有错误都返回 200,比如校验失败返回 400,比返回 200+错误信息更规范。