HTTP 协议
一、核心概念
HTTP(Hyper Text Transfer Protocol,超文本传输协议)是浏览器与服务器之间数据传输的规则约定。
它定义了请求和响应的格式,是万维网(WWW)的基础协议。
二、核心交互模型
HTTP 基于请求 – 响应模型工作:
三、主要特点
基于 TCP 协议
- HTTP 底层依赖 TCP 协议,因此是面向连接的,传输过程更安全可靠。
- 建立连接时会经过 TCP 三次握手,确保通信链路稳定。
请求 – 响应模型
- 严格遵循 “一次请求对应一次响应” 的模式,服务器不会主动向客户端推送数据。
无状态协议
- 定义:协议本身不具备记忆能力,每次请求 – 响应都是独立的,服务器不会记录之前的请求信息。
- 缺点:多次请求之间无法直接共享数据(如用户登录状态),需借助 Cookie、Session 等技术补充。
- 优点:减少了服务器的存储和计算开销,使得协议本身更轻量,处理速度更快。
四、常用请求方法
请求方法定义了客户端希望服务器执行的操作,常见的有:
| GET | 向服务器请求获取资源 | 页面查询、搜索(参数拼接在 URL 中) |
| POST | 向服务器提交数据,用于创建或更新资源 | 提交表单、上传文件(数据放在请求体中) |
| PUT | 向服务器提交数据,用于更新资源 | 全量更新数据(如修改用户信息) |
| DELETE | 请求服务器删除指定资源 | 删除数据(如删除订单) |
| HEAD | 与 GET 类似,但只返回响应头,不返回响应体 | 检查资源是否存在或获取资源元信息 |
| OPTIONS | 查询服务器支持的请求方法 | 跨域请求预检(CORS) |
GET vs POST 核心区别
- GET 参数在 URL 中,长度有限制,安全性低;POST 参数在请求体中,长度无限制,安全性更高。
- GET 请求可被缓存、收藏;POST 请求不可被缓存、收藏。
五、HTTP 状态码
状态码是服务器对请求的处理结果进行的分类标识,分为 5 大类:
| 1xx 信息性 | 100-199 | 服务器已接收请求,需客户端继续操作 | 101(切换协议,如升级为 WebSocket) |
| 2xx 成功 | 200-299 | 请求已成功处理 | 200(OK,请求成功)、201(Created,资源创建成功) |
| 3xx 重定向 | 300-399 | 需客户端进一步操作才能完成请求 | 301(永久重定向)、302(临时重定向)、304(资源未修改,使用缓存) |
| 4xx 客户端错误 | 400-499 | 客户端请求有误,服务器无法处理 | 400(Bad Request,请求参数错误)、401(Unauthorized,未授权)、403(Forbidden,禁止访问)、404(Not Found,资源不存在) |
| 5xx 服务器错误 | 500-599 | 服务器处理请求时发生错误 | 500(Internal Server Error,服务器内部错误)、502(Bad Gateway,网关错误)、503(Service Unavailable,服务不可用) |
六、请求报文与响应报文结构
HTTP 报文由行、头、体三部分组成:
1. 请求报文结构
请求行(请求方法 + URL + HTTP版本)
请求头(键值对,如 Host、User-Agent、Content-Type)
空行
请求体(POST/PUT 请求时携带的数据)
示例
POST /login HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 30
{"username":"admin","password":"123456"}
案例
GET /request?name=ys HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cache-Control: max-age=0
Connection: keep-alive
Host: localhost:8080
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36 Edg/144.0.0.0
sec-ch-ua: "Not(A:Brand";v="8", "Chromium";v="144", "Microsoft Edge";v="144"
sec-ch-ua-mobile: ?1
sec-ch-ua-platform: "Android"
1. 请求行(Request Line)
GET /request?name=ys HTTP/1.1
- GET:请求方法,表示获取资源
- /hello?name=ys:请求路径及查询参数
- HTTP/1.1:使用的 HTTP 协议版本
2. 请求头(Request Headers)
这部分是一系列键值对,用来描述请求的附加信息,比如客户端能力、目标主机等。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cache-Control: max-age=0
Connection: keep-alive
Host: localhost:8080
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36 Edg/144.0.0.0
sec-ch-ua: "Not(A:Brand";v="8", "Chromium";v="144", "Microsoft Edge";v="144"
sec-ch-ua-mobile: ?1
sec-ch-ua-platform: "Android"
3. 空行
请求头结束后,会有一个单独的空行(CRLF),用来分隔请求头和请求体。
4. 请求体(Request Body)
在这个 GET 请求中,请求体是空的。
因为 GET 请求的参数通常会放在 URL 的查询字符串里(如 ?name=ys),所以不需要在请求体中携带数据。只有 POST、PUT 等请求才会在请求体中发送数据。
2. 响应报文结构
响应行(HTTP版本 + 状态码 + 状态描述)
响应头(键值对,如 Content-Type、Set-Cookie、Cache-Control)
空行
响应体(返回给客户端的资源内容,如 HTML、JSON)
示例
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 25
{"code":200,"msg":"登录成功"}
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Content-Length: 2
Date: Sun, 25 Jan 2026 14:40:41 GMT
Keep-Alive: timeout=60
Connection: keep-alive
//空行
//无数据
七、常见请求头与响应头
-
常用请求头
请求头字段含义与说明 Host 请求的目标服务器域名和端口,即请求的主机名。 User-Agent 客户端浏览器或设备信息,例如 Chrome 浏览器的标识类似 Mozilla/5.0 … Chrome/79。 Accept 表示浏览器能接收的资源类型,如 text/*、image/* 或者 */* 表示所有类型。 Accept-Language 表示浏览器偏好的语言,服务器可以据此返回不同语言的网页。 Accept-Encoding 表示浏览器可以支持的压缩类型,例如 gzip、deflate 等。 Content-Type 请求体的数据格式(如 application/json、multipart/form-data),即请求主体的数据类型。 Content-Length 请求主体的大小(单位:字节)。 Authorization 身份验证信息(如 Bearer Token),用于携带用户的身份凭证。 Cookie 客户端存储的 Cookie 数据,每次请求会自动携带,用于维持会话状态。
常用响应头
响应头字段含义与说明 HTTP/1.1 200 OK 响应行,包含协议版本、状态码和状态描述。 Content-Type 响应体的数据格式,如 text/html;charset=UTF-8、application/json。 Content-Length 响应主体的大小(单位:字节)。 Date 服务器生成响应的时间。 Set-Cookie 服务器向客户端设置 Cookie,用于维持会话状态。 Cache-Control 控制浏览器缓存策略,如 no-cache、max-age=3600。 Access-Control-Allow-Origin 跨域资源共享(CORS)允许的源,如 * 表示允许所有域名。 Location 重定向目标 URL,配合 3xx 状态码使用。 Keep-Alive 控制持久连接的超时时间,如 timeout=60。 Connection 表示连接状态,如 keep-alive 表示保持连接。
-
HTTP 状态码分类对照表
状态码范围含义说明 1xx 响应中 – 临时状态码,表示请求已经接收,告诉客户端应该继续请求或者如果它已经完成则忽略它。 2xx 成功 – 表示请求已经被成功接收,处理已完成。 3xx 重定向 – 重定向到其他地方;让客户端再发起一次请求以完成整个处理。 4xx 客户端错误 – 处理发生错误,责任在客户端。如:请求了不存在的资源、客户端未被授权、禁止访问等。 5xx 服务器错误 – 处理发生错误,责任在服务端。如:程序抛出异常等。
3.x重定向
301 Moved Permanently
(永久重定向)
当客户端访问一个 URL 时,服务端返回 301 状态码,意味着:
- 这个请求的资源已经被永久移动到了新的 URL
- 浏览器会自动跳转到响应头 Location 字段指定的新地址
- 浏览器会缓存这个重定向关系,下次再访问旧地址时,会直接请求新地址,不再经过服务端跳转
1.发出请求
http://www.bilibili.com/
正确的应该是https协议
可以看到有两次请求

第一次请求得到的状态码是3开头,返回一个Location: https://www.bilibili.com/

浏览器根据返回的Location进行第二次请求
4.x客户端错误
404资源不存在
请求一个本地不存在的 localhost:8080/request2

5.x服务器错误
500 Internal Server Error
在后端设置一个错误
@RequestMapping(value = "/request")
public String request(HttpServletRequest request) {
// 获取请求方式
String method = request.getMethod();
int a=1/0;//springBoot捕捉到的异常,返回500错误
…
return "Ok";
}

八、无状态问题的解决方案
为了解决 HTTP 无状态导致的 “多次请求无法共享数据” 问题,常用以下技术:
九、HTTP 协议的发展
- HTTP/1.1:目前应用最广泛的版本,支持持久连接、管线化请求(理论支持但实际几乎未落地)。
- HTTP/2:引入多路复用、二进制分帧、服务器推送等特性,大幅提升性能。
- HTTP/3:基于 QUIC 协议,使用 UDP 传输,解决了 TCP 队头阻塞问题,进一步提升速度和稳定性。
HTTP 请求 – 响应完整流程(Java 后端版)
全程仅服务端做对象封装,客户端仅收发 / 解析 HTTP 纯文本,Web 容器(Tomcat)负责格式转换,核心流程共 6 步:
核心关键记忆
- HttpServletRequest/HttpServletResponse:仅服务端生效的 Java 工具对象,目的是让程序员便捷操作请求 / 响应,不会传递给客户端;
- 前后端传输的唯一格式:HTTP 纯文本(请求文本 / 响应文本),客户端无对应 Java 对象,也无需封装。


