Skip to content

HTTP 学习笔记 ​

📚 学习路线图 ​

  1. 基础概念

    • HTTP 是什么
    • URL/URI 的组成
    • 请求与响应模型
  2. HTTP 请求方法

    • GET、POST、PUT、DELETE
    • PATCH、HEAD、OPTIONS
    • 各方法的区别和使用场景
  3. HTTP 状态码

    • 2xx 成功
    • 3xx 重定向
    • 4xx 客户端错误
    • 5xx 服务器错误
  4. HTTP 请求头

    • 常见请求头
    • Content-Type
    • Authorization
  5. HTTP 响应头

    • 常见响应头
    • Cache-Control
    • Set-Cookie
  6. HTTP 版本

    • HTTP/1.0
    • HTTP/1.1
    • HTTP/2
    • HTTP/3
  7. 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客户端存储的 CookieCookie: session=abc123
Referer来源页面Referer: https://example.com

Content-Type 常见值 ​

值说明
application/jsonJSON 数据
application/x-www-form-urlencoded表单数据(默认)
multipart/form-data多部分表单(文件上传)
text/plain纯文本
text/htmlHTML 文档
application/xmlXML 数据

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设置 CookieSet-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/users

POST 请求 ​

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

推荐资源 ​

学习文档 ​

学习网站 ​

工具 ​