常见的HTTP状态码有哪些?

HTTP状态码是服务器对客户端请求的响应状态标识,由三位数字组成,分为5大类(1xx-5xx),每类代表不同的响应含义。了解Java开发中,理解状态码有助于正确处理网络请求、调试接口问题(如使用HttpClient、Spring MVC等场景)。

一、状态码分类及核心含义

类别范围含义典型场景
1xx100-199信息性响应(请求已接收,继续处理)协议升级、请求预处理
2xx200-299成功响应(请求已被成功处理)数据查询成功、提交成功
3xx300-399重定向(需要进一步操作完成请求)资源迁移、临时跳转
4xx400-499客户端错误(请求存在问题)参数错误、权限不足、资源不存在
5xx500-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.comhttps://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);
        }
    }
}

四、关键总结

  1. 2xx:业务正常,可直接处理返回数据。
  2. 3xx:需根据Location头进行重定向(客户端自动处理或手动跳转)。
  3. 4xx:重点检查客户端请求(参数、权限、URL等),是接口调试的常见错误。
  4. 5xx:需排查服务器端问题(日志、代码异常、资源占用等)。

在Java开发中,合理使用状态码能让接口语义更清晰(如用201表示创建成功),同时便于前后端协作和问题定位。例如,Spring Boot中可通过@ResponseStatus注解自定义状态码,使响应更符合HTTP规范。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值