Java学习第一百二十一部分——HTTP
目录
一、前言简介
二、核心特性
三、通信基础结构
四、关键组件详解
五、性能演进——版本对比
六、开发者建议
七、总结归纳
一、前言简介
HTTP(“H”yper“t”ext “T”ransfer “P”rotocol,超文本传输协议)是互联网上应用最广泛的应用层协议,用于在客户端(如浏览器)和服务器之间传输超文本(如网页)及其他资源。
二、核心特性
1. 无状态协议 (Stateless)
-
每个请求独立处理,服务器不保存客户端之前的请求状态。
-
解决方案:使用 Cookies、Session 或 Token 维持会话状态(如登录态)。
2. 请求-响应模型 (Request-Response)
-
客户端发起请求 → 服务器返回响应(含状态码、头、数据)。
3. 基于文本的协议 (早期)
-
HTTP/1.x 使用明文传输请求头和数据(可读性强,但效率低)。
-
HTTP/2+ 改用二进制分帧提升性能。
4. 可扩展性
-
支持自定义请求头(如 `Authorization: Bearer token`)和响应头。
三、通信基础结构
[客户端 Client]------>发送HTTP请求------>[服务器 Server]
[服务器 Server]------>返回HTTP响应------>[客户端 Client]
请求组成:
-
请求行(方法 + URL + HTTP版本,如 `GET /index.html HTTP/1.1`)
-
请求头(元数据,如 `User-Agent`, `Accept-Language`)
-
请求体(可选,如 POST 提交的表单数据)
响应组成:
-
状态行(版本 + 状态码 + 描述,如 `HTTP/1.1 200 OK`)
-
响应头(元数据,如 `Content-Type: text/html`)
-
响应体(资源数据,如 HTML 内容)
四、关键组件详解
1. URL(统一资源定位符)
-
格式:`https://www.example.com:443/path?query=value#fragment`
-
组成:协议 `https` + 域名 `www.example.com` + 端口 `443` + 路径 `/path` + 查询参数 `?query=value` + 锚点 `#fragment`
2. HTTP 主要方法(Methods)
GET
:
-
语义:请求指定资源的表示。只应用于获取数据,不应产生副作用。
-
特点:安全、幂等。数据通过URL查询字符串传递。
-
示例:获取网页、图片、API数据。
POST
:
-
语义:向指定资源提交数据(通常会导致服务器端状态变化或产生副作用,如创建新资源)。
-
特点:不安全、不幂等。数据通常放在请求体中。
-
示例:提交表单、上传文件、创建订单。
PUT
:
-
语义:替换目标资源的所有当前表示(完整更新)。如果资源不存在,可能由服务器创建(需约定)。
-
特点:不安全、幂等。数据放在请求体中。
-
示例:更新用户个人资料(全部字段)。
DELETE
:
-
语义:删除指定的资源。
-
特点:不安全、幂等。
-
示例:删除一篇文章、一个用户。
PATCH
:
-
语义:对资源应用部分修改。
-
特点:不安全、不幂等(取决于修改类型,但通常视为不幂等)。数据(描述如何修改)放在请求体中。
-
示例:更新用户邮箱(只需发送邮箱字段)。
HEAD
:
-
语义:与
GET
相同,但服务器只返回响应头,不返回响应体。 -
特点:安全、幂等。用于获取资源的元信息(如检查资源是否存在、检查修改时间
Last-Modified
/ETag
用于缓存)。 -
示例:检查链接有效性、获取文件大小但不下载。
OPTIONS
:
-
语义:获取目标资源支持的通信选项(允许的方法等)。
-
特点:安全、幂等。常用于CORS预检请求。
-
示例:浏览器在发送跨域
PUT
请求前,先发OPTIONS
请求询问服务器是否允许。
CONNECT
:
-
语义:建立到目标资源标识的服务器的隧道(通常用于通过代理建立SSL/TLS连接)。
-
特点:特殊用途。
-
示例:通过代理建立HTTPS连接。
TRACE
:
-
语义:沿着到目标资源的路径执行一个消息环回测试(主要用于诊断)。
-
特点:安全、幂等。出于安全考虑,现代浏览器通常禁用。
-
示例:调试网络请求路径。
📌 方法关键特性总结
HTTP 方法 | 安全方法 (Safe) | 幂等方法 (Idempotent) | 常用方法 (Common) | 通常有请求体 (Request Body) | CORS 相关角色 (CORS Role) |
---|---|---|---|---|---|
GET | ✅ 是 | ✅ 是 | ✅ 是 | ❌ 否 | 简单请求 / 触发预检 |
HEAD | ✅ 是 | ✅ 是 | ⭕ 有时 | ❌ 否 | 简单请求 / 触发预检 |
POST | ❌ 否 | ❌ 否 | ✅ 是 | ✅ 是 | 非简单请求 / 触发预检 |
PUT | ❌ 否 | ✅ 是 | ✅ 是 | ✅ 是 | 非简单请求 / 触发预检 |
PATCH | ❌ 否 | ❌ 通常不是 | ✅ 是 | ✅ 是 | 非简单请求 / 触发预检 |
DELETE | ❌ 否 | ✅ 是 | ✅ 是 | ❌ 通常没有 | 非简单请求 / 触发预检 |
OPTIONS | ✅ 是 | ✅ 是 | ⭕ 有时 | ❌ 通常没有 | 在预检请求中至关重要 |
TRACE | ✅ 是 | ✅ 是 | ❌ 否 | ❌ 否 | 简单请求 / 触发预检 |
-
安全方法 (Safe): 指不会修改服务器状态的方法。
-
幂等方法 (Idempotent): 指执行一次与执行多次效果相同的方法(服务器状态最终一致)。
-
常用方法 (Common): 指在构建 RESTful API 或常规 Web 开发中最常使用的方法。
-
通常有请求体 (Request Body): 指该方法在请求中通常会携带数据负载(请求体)
-
CORS 相关角色 (CORS Role):OPTIONS: 在 CORS 机制中扮演核心角色。浏览器在发送可能产生副作用的跨域请求前,会自动发送一个
OPTIONS
请求(预检请求)到目标服务器,以询问实际请求(POST
,PUT
,DELETE
,PATCH
等)是否被允许。服务器通过OPTIONS
响应的 CORS 头来告知浏览器后续请求能否继续。
3. 状态码(Status Codes)
`1xx`:信息性状态
`2xx`:成功
-
`200 OK`:请求成功
-
`201 Created`:资源已创建(配合 POST/PUT)
`3xx`:重定向
-
`301 Moved Permanently`:永久重定向
-
`302 Found`:临时重定向
`4xx`:客户端错误
-
`400 Bad Request`:请求语法错误
-
`401 Unauthorized`:未认证
-
`403 Forbidden`:无权限
-
`404 Not Found`:资源不存在
`5xx`:服务器错误
-
`500 Internal Server Error`:服务器内部错误
-
`503 Service Unavailable`:服务不可用
4. 头部字段(Headers)
常用请求头:
-
`Host: example.com`:目标域名(HTTP/1.1 必需)
-
`User-Agent`: 客户端标识
-
`Cookie: name=value`:发送 cookies
-
`Authorization: Bearer xxxx`:身份凭证
常用响应头:
-
`Set-Cookie: name=value`:设置 cookies
-
`Content-Type: text/html; charset=utf-8`:响应数据类型
-
`Cache-Control: max-age=3600`:缓存控制
五、性能演进——版本对比
特性 | HTTP/0.9 (1991) | HTTP/1.0 (1996 - RFC 1945) | HTTP/1.1 (1997/1999 - RFC 2068/2616) | HTTP/2 (2015 - RFC 7540) | HTTP/3 (2022 - RFC 9114) |
---|---|---|---|---|---|
核心模型 | 单请求单响应,无头 | 单请求单响应 | 持久连接,管道化(理论) | 多路复用,二进制帧 | 基于QUIC的多路复用 |
连接方式 | 每个请求后关闭TCP连接 | 默认关闭连接 (Connection: close ) | 默认持久连接 (Connection: keep-alive ) | 单一持久TCP连接 | 基于UDP的QUIC连接 |
头部传输 | 无头部 | 纯文本头部 | 纯文本头部 (可能重复、冗长) | HPACK头部压缩 | QPACK头部压缩 |
数据传输 | 仅响应体(无格式信息) | 响应体 | 响应体,分块传输(Transfer-Encoding: chunked ) | 二进制分帧 | 二进制分帧 |
服务器推送 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 | ✅ 支持 (主动推送资源) | ✅ 支持 |
请求优先级 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 | ✅ 支持 | ✅ 支持 |
队头阻塞问题 | 严重 (每个请求新连接) | 严重 (每个请求新连接) | TCP层HOL阻塞 (管道化难实现) | 流级别HOL阻塞 (TCP层仍存在) | ✅ 基本消除 (QUIC流独立) |
主要优势 | 极简 | 引入了元数据(头) | 性能提升(持久连接),缓存、Host头等 | 性能飞跃(多路复用、头部压缩、推送) | 极致性能(消除TCP HOLB),更快连接建立 |
主要劣势 | 功能极其有限 | 连接开销巨大 | HOL阻塞限制性能 | TCP层仍存在HOL阻塞 | 部署复杂度高,UDP可能被网络设备限制 |
当前状态 | 完全废弃 | 基本废弃 | 广泛使用(尤其老系统/简单场景) | 主流版本 | 快速增长 |
> HTTP/3 核心优势:
> 解决 TCP 队头阻塞,抗丢包能力更强
> 0-RTT/1-RTT 快速连接(尤其弱网环境)
> 连接迁移(切换网络 IP 不断连)
六、开发者建议
-
新项目优先启用 HTTP/2/3 + HTTPS
-
API 设计严格遵循方法语义(如 `GET` 只读、`PUT` 幂等)
-
利用缓存头(`Cache-Control`, `ETag`)优化性能
七、总结归纳
-
基础角色:Web 通信的基石,定义客户端与服务器的交互规则。
-
核心痛点解决:
- 无状态 → 通过 Cookie/Session 管理状态
- 性能瓶颈 → HTTP/2 多路复用、HTTP/3 QUIC 协议
- 安全性 → HTTPS 加密传输
-
应用场景:网页浏览、API 交互(RESTful)、文件传输、实时通信(WebSocket 基于 HTTP 升级)等。