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

推荐资源

学习文档

学习网站

工具