Appearance
HTTP 与 HTTPS
HTTP 报文结构
HTTP/1.1 是文本报文;HTTP/2、HTTP/3 在语义上仍有方法、头部、状态码和主体,但采用二进制帧传输。
请求报文
http
POST /api/orders?preview=true HTTP/1.1
Host: api.example.com
Accept: application/json
Content-Type: application/json
Content-Length: 18
Authorization: Bearer <token>
Cookie: session_id=abc
{"productId": 42}组成:请求行(方法、目标、版本)→ 请求头 → 空行 → 可选请求体。
常见请求头:
| 字段 | 含义 |
|---|---|
Host | 目标主机;HTTP/1.1 中必需,用于虚拟主机路由 |
Accept / Accept-Encoding | 可接受的媒体类型 / 压缩编码 |
Content-Type / Content-Length | 请求体格式 / 长度 |
Authorization | 身份认证信息 |
Cookie | 请求携带的 Cookie |
If-None-Match / If-Modified-Since | 协商缓存条件 |
Connection | HTTP/1.x 连接管理,如 keep-alive 或 close |
响应报文
http
HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8
Location: /api/orders/9527
Cache-Control: no-store
Set-Cookie: session_id=abc; HttpOnly; Secure; SameSite=Lax
{"id": 9527}组成:状态行(版本、状态码、原因短语)→ 响应头 → 空行 → 可选响应体。
常见响应头:Content-Type、Content-Length、Cache-Control、ETag、Last-Modified、Location、Set-Cookie、Access-Control-Allow-Origin、Content-Encoding。
方法、语义与幂等性
| 方法 | 常见用途 | 安全(不改变资源语义) | 幂等 |
|---|---|---|---|
GET | 获取资源 | 是 | 是 |
HEAD | 仅获取响应头 | 是 | 是 |
POST | 创建资源、提交动作 | 否 | 通常否 |
PUT | 整体替换指定资源 | 否 | 是 |
PATCH | 部分更新 | 否 | 不保证 |
DELETE | 删除资源 | 否 | 通常是 |
OPTIONS | 查询通信选项、CORS 预检 | 是 | 是 |
GET 与 POST:避免常见误解
GET的参数通常在 URL 查询串中;POST的数据通常在请求体中,但 HTTP 规范并不禁止其他形式。- URL 更容易出现在历史记录、日志、书签和
Referer中;但 POST 并不天然安全。传输保密依赖 HTTPS,敏感数据也不应记录在日志中。 - URL 长度受客户端、代理和服务器限制;POST 请求体也受服务器、网关和配置限制,不是“无限大”。
GET可缓存;POST也可在明确响应缓存策略时被缓存,只是实践中较少。
常见状态码
| 分类 | 常用状态码 | 含义 |
|---|---|---|
| 1xx | 100 Continue | 请求处理中间响应 |
| 2xx | 200、201、202、204、206 | 成功、已创建、已接受、无内容、范围响应 |
| 3xx | 301、302、304、307、308 | 永久/临时重定向、缓存未修改、保留方法的重定向 |
| 4xx | 400、401、403、404、405、429 | 请求错误、需认证、禁止、未找到、方法不允许、限流 |
| 5xx | 500、501、502、503、504 | 内部错误、未实现、坏网关、不可用、网关超时 |
401 表示需要认证(一般伴随 WWW-Authenticate);403 表示服务器理解请求但拒绝授权。304 是协商缓存结果,通常不带响应体,不是重定向。
HTTP 缓存
强缓存
浏览器在缓存仍新鲜时直接使用本地副本,不请求服务器。现代实践以 Cache-Control 为主:
http
Cache-Control: public, max-age=31536000, immutableExpires 是绝对时间,受客户端时钟影响,已被 max-age 取代但仍可为兼容性保留。常见指令还有 no-store(不存储)、no-cache(可存储但复用前必须验证)、private、s-maxage。
协商缓存
强缓存过期或策略要求验证时,客户端带条件请求:
http
If-None-Match: "a1b2c3" # 对应 ETag,优先级更高
If-Modified-Since: Tue, 01 Jul 2025 12:00:00 GMT资源未变化时服务端返回 304 Not Modified;否则返回 200 和新响应体。Last-Modified 的精度和“内容没变但修改时间变了”会造成误判;ETag 是资源版本标识,通常更精确,但生成成本由服务端决定。
HTTP 版本演进
| 版本 | 关键能力 | 限制/说明 |
|---|---|---|
| HTTP/1.0 | 默认短连接 | 可借 Connection: keep-alive 复用连接 |
| HTTP/1.1 | 默认持久连接、Host、分块传输、Range | 管道化理论可用但部署少;同一连接响应顺序导致队头阻塞 |
| HTTP/2 | 二进制分帧、多路复用、HPACK、流优先级、服务端推送 | 解决 HTTP 层队头阻塞,但 TCP 丢包仍会阻塞同连接中的流;服务端推送现已较少使用 |
| HTTP/3 | HTTP 语义运行于 QUIC | 流独立可靠传输,单流丢包不阻塞其他流 |
HTTPS 与 TLS
HTTPS = HTTP 运行在 TLS 保护的安全通道上,通常用 443 端口(HTTP 常用 80)。TLS 提供:
- 机密性:对称加密保护传输内容;
- 完整性:AEAD/MAC 防篡改;
- 身份认证:客户端验证服务器证书与域名,确认服务端身份。
现代 TLS(如 TLS 1.3)一般使用(EC)DHE 协商临时共享密钥,服务器用证书私钥签名证明身份;不是简单地“客户端生成对称密钥,再用服务器公钥加密发送”。握手后双方用协商出的会话密钥加密 HTTP 数据。证书验证包括证书链、有效期、域名和撤销状态等检查。