HTTP 协议
BeginnerWeb FundamentalsHTTP(HyperText Transfer Protocol)是浏览器与服务器之间通信的 应用层协议,是 Web 运作的基石。
一、📡 请求/响应模型
HTTP 采用 请求-响应(Request-Response) 模式:客户端发送请求,服务器返回响应。
客户端(浏览器) 服务器
│ │
│──── HTTP Request ────────────────►│
│ (GET /index.html) │
│ │
│◄──── HTTP Response ──────────────│
│ (200 OK + HTML 文件) │
│ │1.1 HTTP 请求结构
一个 HTTP 请求由三部分组成:
http
GET /api/users HTTP/1.1 ← 请求行(方法 + 路径 + 协议版本)
Host: example.com ← 请求头(Headers)
Accept: text/html
User-Agent: Chrome/120
← 请求体(Body,仅 POST/PUT 等有)| 部分 | 说明 |
|---|---|
| 请求行 | 方法(GET)、资源路径(/api/users)、HTTP 版本 |
| 请求头 | 附加信息(主机名、接受的内容类型、浏览器标识等) |
| 请求体 | 发送给服务器的数据(如表单内容、JSON),GET 请求通常没有 |
1.2 HTTP 响应结构
http
HTTP/1.1 200 OK ← 状态行(协议版本 + 状态码 + 描述)
Content-Type: text/html ← 响应头(Headers)
Content-Length: 3456
<!DOCTYPE html> ← 响应体(Body,即返回的内容)
<html>...</html>二、📮 HTTP 方法(Methods)
HTTP 方法定义了对资源的 操作类型:
| 方法 | 语义 | 幂等性 | 典型用途 |
|---|---|---|---|
| GET | 获取资源 | ✅ 是 | 加载网页、获取数据 |
| POST | 创建资源 | ❌ 否 | 提交表单、创建新记录 |
| PUT | 替换资源 | ✅ 是 | 更新完整资源 |
| PATCH | 部分更新 | ❌ 否 | 修改资源的部分字段 |
| DELETE | 删除资源 | ✅ 是 | 删除指定资源 |
幂等性(Idempotent)
幂等操作意味着 执行一次和执行多次的效果相同。GET 请求不管发送多少次,服务器上的数据不会改变;而 POST 每次可能创建一条新记录。
CRUD 映射
Web 开发中,HTTP 方法与数据操作(CRUD)直接对应:
| CRUD | HTTP 方法 | 示例 |
|---|---|---|
| Create(创建) | POST | POST /api/users |
| Read(读取) | GET | GET /api/users/123 |
| Update(更新) | PUT / PATCH | PUT /api/users/123 |
| Delete(删除) | DELETE | DELETE /api/users/123 |
三、🔢 状态码(Status Codes)
服务器通过状态码告知客户端请求的处理结果,按首位数字分为五类:
3.1 分类总览
| 范围 | 类别 | 含义 |
|---|---|---|
| 1xx | 信息性 | 请求已接收,继续处理 |
| 2xx | 成功 | 请求已成功处理 |
| 3xx | 重定向 | 需要进一步操作才能完成 |
| 4xx | 客户端错误 | 请求有误(客户端的问题) |
| 5xx | 服务器错误 | 服务器处理请求时出错 |
3.2 常用状态码
| 状态码 | 名称 | 说明 |
|---|---|---|
| 200 | OK | 请求成功 |
| 201 | Created | 资源创建成功(常见于 POST 响应) |
| 301 | Moved Permanently | 资源永久移动到新 URL |
| 302 | Found | 资源临时重定向 |
| 304 | Not Modified | 资源未改变,使用缓存版本 |
| 400 | Bad Request | 请求语法错误,服务器无法理解 |
| 401 | Unauthorized | 未认证(需要登录) |
| 403 | Forbidden | 已认证但无权限访问 |
| 404 | Not Found | 请求的资源不存在 |
| 500 | Internal Server Error | 服务器内部错误 |
| 502 | Bad Gateway | 网关/代理服务器收到无效响应 |
| 503 | Service Unavailable | 服务器暂时不可用(过载或维护) |
记忆技巧
- 2xx = 一切正常 ✅
- 3xx = 去别的地方 ↗️
- 4xx = 你搞错了 ❌(客户端问题)
- 5xx = 我搞错了 💥(服务器问题)
四、📋 Headers(请求头 / 响应头)
Headers 是 HTTP 消息中的 键值对元数据,提供请求或响应的附加信息。
4.1 常见请求头
| Header | 作用 | 示例值 |
|---|---|---|
Host | 目标服务器的域名 | www.example.com |
User-Agent | 客户端标识(浏览器类型) | Mozilla/5.0 Chrome/120 |
Accept | 客户端可接受的内容类型 | text/html, application/json |
Content-Type | 请求体的数据格式 | application/json |
Authorization | 认证凭据 | Bearer eyJhbGci... |
Cookie | 发送存储的 Cookie | session_id=abc123 |
4.2 常见响应头
| Header | 作用 | 示例值 |
|---|---|---|
Content-Type | 响应体的数据格式 | text/html; charset=UTF-8 |
Content-Length | 响应体大小(字节) | 3456 |
Set-Cookie | 设置 Cookie | session_id=abc123; HttpOnly |
Cache-Control | 缓存策略 | max-age=3600 |
Location | 重定向目标 URL | https://new-url.com |
五、🔒 HTTPS
HTTPS = HTTP + TLS/SSL 加密,是 HTTP 的安全版本。
5.1 HTTP vs HTTPS
| 特性 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 加密 | ❌ 明文传输 | ✅ TLS 加密 |
| 证书 | 不需要 | 需要 SSL 证书 |
| URL 前缀 | http:// | https:// |
| 浏览器标识 | ⚠️ "不安全" | 🔒 锁形图标 |
5.2 HTTPS 工作原理(简化)
1. 客户端发起 HTTPS 请求
2. 服务器返回 SSL 证书(含公钥)
3. 客户端验证证书的合法性
4. 双方协商加密密钥(TLS 握手)
5. 后续通信使用对称加密传输数据5.3 为什么必须使用 HTTPS
- 数据安全:防止中间人窃听密码、信用卡等敏感信息
- 数据完整:防止传输过程中的数据篡改
- SEO 加分:Google 将 HTTPS 作为搜索排名因素
- 现代 API:Geolocation、Service Worker 等仅在 HTTPS 下可用