HTTP状态码是服务器对客户端请求的响应状态标识,由三位数字组成,分为5大类(1xx-5xx),每类代表不同的响应含义。了解Java开发中,理解状态码有助于正确处理网络请求、调试接口问题(如使用HttpClient
、Spring MVC等场景)。
一、状态码分类及核心含义
类别 | 范围 | 含义 | 典型场景 |
---|---|---|---|
1xx | 100-199 | 信息性响应(请求已接收,继续处理) | 协议升级、请求预处理 |
2xx | 200-299 | 成功响应(请求已被成功处理) | 数据查询成功、提交成功 |
3xx | 300-399 | 重定向(需要进一步操作完成请求) | 资源迁移、临时跳转 |
4xx | 400-499 | 客户端错误(请求存在问题) | 参数错误、权限不足、资源不存在 |
5xx | 500-599 | 服务器错误(服务器处理请求失败) | 代码异常、服务器过载 |
二、常见状态码详解(附Java场景)
1. 2xx 成功类(最常用)
-
200 OK
含义:请求成功,服务器返回预期数据。
Java场景:@GetMapping
接口正常返回数据时,Spring MVC默认返回200。@GetMapping("/user") public User getUser() { return new User("Alice"); // 响应200 OK }
-
201 Created
含义:请求成功且创建了新资源(如新增数据)。
适用:POST请求创建资源时(如注册用户、上传文件)。@PostMapping("/user") @ResponseStatus(HttpStatus.CREATED) // 显式指定201 public User createUser(@RequestBody User user) { return userService.save(user); }
-
204 No Content
含义:请求成功,但无返回内容(如删除操作)。
适用:DELETE请求或不需要返回数据的更新操作。
2. 3xx 重定向类
-
301 Moved Permanently
含义:资源永久迁移到新URL,浏览器会缓存新地址。
场景:网站域名更换(如http://old.com
→https://new.com
)。 -
302 Found
含义:资源临时位于新URL,浏览器不会缓存(经典重定向)。
Java场景:Spring MVC的redirect:
跳转默认使用302。@GetMapping("/old") public String redirect() { return "redirect:/new"; // 响应302,跳转到/new }
-
304 Not Modified
含义:资源未修改,客户端可使用本地缓存(基于If-Modified-Since
等头)。
作用:减少重复传输,优化性能(常见于静态资源如CSS/JS)。
3. 4xx 客户端错误类(调试重点)
-
400 Bad Request
含义:请求参数错误(格式错误、缺少必要参数)。
Java场景:Spring MVC参数校验失败时返回400。@PostMapping("/user") public User createUser(@Valid @RequestBody User user) { // 若user的字段不符合@NotBlank等注解,会返回400 }
-
401 Unauthorized
含义:请求需要身份认证(未登录或Token无效)。
场景:未携带JWT令牌访问受保护接口。 -
403 Forbidden
含义:已认证,但无权限访问资源(如普通用户访问管理员接口)。
区别于401:401是“未认证”,403是“认证后无权限”。 -
404 Not Found
含义:请求的资源不存在(URL错误或资源已删除)。
Java场景:Spring MVC未匹配到对应@RequestMapping
时返回404。 -
405 Method Not Allowed
含义:请求方法不支持(如用GET访问只允许POST的接口)。
例:客户端用GET /user
访问标注@PostMapping("/user")
的接口。 -
409 Conflict
含义:请求冲突(如创建用户时用户名已存在)。
适用:资源状态冲突场景(如并发修改同一数据)。
4. 5xx 服务器错误类(排查服务器问题)
-
500 Internal Server Error
含义:服务器内部错误(如代码抛出未捕获的异常)。
Java场景:Controller方法中抛出NullPointerException
时返回500。 -
502 Bad Gateway
含义:网关/代理服务器收到上游服务器的无效响应(如反向代理到的后端服务崩溃)。 -
503 Service Unavailable
含义:服务器暂时不可用(如过载、维护中),通常会包含Retry-After
头提示重试时间。 -
504 Gateway Timeout
含义:网关/代理服务器等待上游服务器响应超时(如后端接口执行时间过长)。
三、Java中处理状态码的示例
使用Java 11+的HttpClient
处理不同状态码:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class HttpStatusExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/user/123"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
int statusCode = response.statusCode();
// 根据状态码处理响应
switch (statusCode) {
case 200:
System.out.println("请求成功,数据:" + response.body());
break;
case 404:
System.out.println("用户不存在");
break;
case 401:
System.out.println("未登录,请先认证");
break;
case 500:
System.out.println("服务器错误,请稍后重试");
break;
default:
System.out.println("其他状态:" + statusCode);
}
}
}
四、关键总结
- 2xx:业务正常,可直接处理返回数据。
- 3xx:需根据
Location
头进行重定向(客户端自动处理或手动跳转)。 - 4xx:重点检查客户端请求(参数、权限、URL等),是接口调试的常见错误。
- 5xx:需排查服务器端问题(日志、代码异常、资源占用等)。
在Java开发中,合理使用状态码能让接口语义更清晰(如用201表示创建成功),同时便于前后端协作和问题定位。例如,Spring Boot中可通过@ResponseStatus
注解自定义状态码,使响应更符合HTTP规范。