HTTP 学习笔记
📚 学习路线图
基础概念
- HTTP 是什么
- URL/URI 的组成
- 请求与响应模型
HTTP 请求方法
- GET、POST、PUT、DELETE
- PATCH、HEAD、OPTIONS
- 各方法的区别和使用场景
HTTP 状态码
- 2xx 成功
- 3xx 重定向
- 4xx 客户端错误
- 5xx 服务器错误
HTTP 请求头
- 常见请求头
- Content-Type
- Authorization
HTTP 响应头
- 常见响应头
- Cache-Control
- Set-Cookie
HTTP 版本
- HTTP/1.0
- HTTP/1.1
- HTTP/2
- HTTP/3
HTTPS
- SSL/TLS
- 证书
- 握手过程
什么是 HTTP
HTTP(HyperText Transfer Protocol,超文本传输协议)是应用层协议,用于在 Web 浏览器和 Web 服务器之间传输数据。
┌─────────────┐ HTTP 请求 ┌─────────────┐
│ 客户端 │ ──────────────────────────▶│ 服务器 │
│ (浏览器) │ │ │
│ │◀───────────────────────────│ │
│ │ HTTP 响应 │ │
└─────────────┘ └─────────────┘URL 的组成
https://www.example.com:443/path/to/page?name=value#section
│ │ │ │ │ │
│ │ │ │ │ └─ 锚点(fragment)
│ │ │ │ └──────────── 查询参数
│ │ │ └────────────────────────── 路径
│ │ └─────────────────────────────── 端口(默认 80/443)
│ └────────────────────────────────────────────── 域名
└────────────────────────────────────────────────────── 协议- 协议: http 或 https
- 域名: 服务器的地址
- 端口: 服务器监听的端口(http 默认 80,https 默认 443)
- 路径: 资源的具体位置
- 查询参数: 传递给服务器的数据
- 锚点: 页面内的跳转位置
HTTP 请求方法
| 方法 | 描述 | 幂等性 | 请求体 | 使用场景 |
|---|---|---|---|---|
| GET | 获取资源 | ✅ | ❌ | 查询数据、读取页面 |
| POST | 创建资源 | ❌ | ✅ | 提交表单、上传文件 |
| PUT | 更新整个资源 | ✅ | ✅ | 完整更新资源 |
| PATCH | 部分更新资源 | ❌ | ✅ | 局部更新资源 |
| DELETE | 删除资源 | ✅ | ❌ | 删除资源 |
| HEAD | 获取响应头 | ✅ | ❌ | 检查资源是否存在 |
| OPTIONS | 获取支持的方法 | ✅ | ❌ | CORS 预检请求 |
幂等性说明
- 幂等: 多次请求产生相同结果
- 非幂等: 多次请求可能产生不同结果
HTTP 状态码
2xx 成功
| 状态码 | 含义 | 说明 |
|---|---|---|
| 200 OK | 请求成功 | 请求成功处理 |
| 201 Created | 已创建 | 资源创建成功 |
| 204 No Content | 无内容 | 请求成功但无返回内容 |
3xx 重定向
| 状态码 | 含义 | 说明 |
|---|---|---|
| 301 Moved Permanently | 永久重定向 | 资源永久移动到新位置 |
| 302 Found | 临时重定向 | 资源临时移动到新位置 |
| 304 Not Modified | 未修改 | 缓存有效,服务器未修改资源 |
4xx 客户端错误
| 状态码 | 含义 | 说明 |
|---|---|---|
| 400 Bad Request | 错误请求 | 请求格式错误 |
| 401 Unauthorized | 未授权 | 需要身份验证 |
| 403 Forbidden | 禁止访问 | 服务器拒绝访问 |
| 404 Not Found | 未找到 | 资源不存在 |
| 405 Method Not Allowed | 方法不允许 | 不支持的请求方法 |
| 409 Conflict | 冲突 | 请求与当前资源状态冲突 |
| 429 Too Many Requests | 请求过多 | 超过速率限制 |
5xx 服务器错误
| 状态码 | 含义 | 说明 |
|---|---|---|
| 500 Internal Server Error | 内部服务器错误 | 服务器遇到意外错误 |
| 502 Bad Gateway | 网关错误 | 网关或代理服务器无效 |
| 503 Service Unavailable | 服务不可用 | 服务器暂时不可用 |
| 504 Gateway Timeout | 网关超时 | 网关超时 |
HTTP 请求头
常见请求头
http
GET /api/users HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json
Authorization: Bearer token123
Content-Type: application/json
Content-Length: 25| 请求头 | 说明 | 示例 |
|---|---|---|
| Host | 目标主机 | Host: www.example.com |
| User-Agent | 客户端信息 | User-Agent: Mozilla/5.0... |
| Accept | 接受的内容类型 | Accept: application/json |
| Content-Type | 请求体内容类型 | Content-Type: application/json |
| Content-Length | 请求体长度 | Content-Length: 100 |
| Authorization | 身份验证信息 | Authorization: Bearer token |
| Cookie | 客户端存储的 Cookie | Cookie: session=abc123 |
| Referer | 来源页面 | Referer: https://example.com |
Content-Type 常见值
| 值 | 说明 |
|---|---|
application/json | JSON 数据 |
application/x-www-form-urlencoded | 表单数据(默认) |
multipart/form-data | 多部分表单(文件上传) |
text/plain | 纯文本 |
text/html | HTML 文档 |
application/xml | XML 数据 |
HTTP 响应头
常见响应头
http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 50
Date: Thu, 01 Jan 2024 00:00:00 GMT
Server: nginx/1.18.0
Set-Cookie: session=abc123; HttpOnly; Secure
Cache-Control: max-age=3600| 响应头 | 说明 | 示例 |
|---|---|---|
| Content-Type | 响应内容类型 | Content-Type: application/json |
| Content-Length | 响应体长度 | Content-Length: 100 |
| Date | 响应时间 | Date: Thu, 01 Jan 2024 00:00:00 GMT |
| Server | 服务器信息 | Server: nginx/1.18.0 |
| Set-Cookie | 设置 Cookie | Set-Cookie: token=xxx |
| Cache-Control | 缓存控制 | Cache-Control: max-age=3600 |
| ETag | 资源标识 | ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4" |
Cache-Control 常见值
| 值 | 说明 |
|---|---|
no-cache | 使用前必须验证 |
no-store | 不缓存任何内容 |
max-age=3600 | 缓存 3600 秒 |
public | 可被任何缓存存储 |
private | 仅客户端可缓存 |
HTTP 版本对比
HTTP/1.0
- 每次请求建立新连接(短连接)
- 基于 ASCII 文本传输
HTTP/1.1
- 支持持久连接(Keep-Alive)
- 支持管道化(Pipelining)
- 引入更多状态码和请求头
HTTP/2
- 二进制协议(非 ASCII)
- 多路复用(多个请求共享一个连接)
- 头部压缩(HPACK)
- 服务器推送
HTTP/3
- 基于 QUIC 协议(UDP)
- 解决队头阻塞问题
- 更快的连接建立
HTTP/1.0 HTTP/1.1 HTTP/2 HTTP/3
──────── ──────── ─────── ──────
请求1→建立连接 请求1→建立连接 ┌──请求1 请求1
├→响应 │→响应1 │→响应1 请求2
请求2→建立连接 │→保持连接 │ 请求3
├→响应 │→请求2 ├──请求2 (多路复用)
请求3→建立连接 │→响应2 │→响应2
├→响应 │→保持连接 │ (无队头阻塞)
│→请求3 ├──请求3
│→响应3 │→响应3
└→关闭连接 └→保持连接 (基于UDP)
│
└→一个TCP连接HTTPS
HTTPS 是什么
HTTPS(HTTP Secure)是 HTTP 的安全版本,使用 SSL/TLS 协议对通信进行加密。
HTTP HTTPS
──────── ────────
明文传输 加密传输
├→ SSL/TLS 握手
├→ 交换密钥
└→ 加密通信HTTPS 工作流程
客户端 服务器
│ │
│ 1. ClientHello │
│ ────────────────────────────▶ │
│ (支持的加密套件、随机数) │
│ │
│ 2. ServerHello │
│ ◀──────────────────────────── │
│ (选择的加密套件、随机数、证书) │
│ │
│ 3. 验证证书 │
│ ─────── │
│ │
│ 4. Pre-Master Secret │
│ ────────────────────────────▶ │
│ (加密的随机数) │
│ │
│ 5. 生成会话密钥 │
│ │
│ 6. Finished │
│ ◀──────────────────────────── │
│ (确认密钥) │
│ │
│ ✅ 安全通信开始 │HTTPS 证书
证书由受信任的证书颁发机构(CA)签发,包含:
- 公钥
- 域名信息
- 颁发机构
- 有效期
- 数字签名
常见 HTTPS 问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 证书过期 | 证书有效期已过 | 更新证书 |
| 域名不匹配 | 证书域名与访问域名不同 | 使用正确的域名或证书 |
| 自签名证书 | 非权威机构签发 | 使用权威 CA 签发的证书 |
示例:使用 cURL 测试 HTTP
基本请求
bash
# GET 请求
curl https://api.example.com/users
# 查看请求头
curl -I https://api.example.com/users
# 查看详细过程
curl -v https://api.example.com/usersPOST 请求
bash
# JSON 数据
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name":"张三","age":25}'
# 表单数据
curl -X POST https://api.example.com/login \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=admin&password=123456"带认证
bash
# Bearer Token
curl https://api.example.com/profile \
-H "Authorization: Bearer your_token_here"
# Basic Auth
curl https://api.example.com/admin \
-u username:password