Skip to content

HTTP 协议基础:Web 通信的语言与核心机制

什么是 HTTP?

HTTP(HyperText Transfer Protocol,超文本传输协议)是 Web 世界中最重要的通信协议。它定义了浏览器和服务器之间如何交换信息。

用生活类比理解 HTTP

想象你去餐厅点餐:

  1. 你(浏览器):你好,我要一份意大利面(发送请求)
  2. 服务员(HTTP 协议):收到,我去传达给厨房(传输请求)
  3. 厨房(服务器):好的,这是做好的意大利面(准备响应)
  4. 服务员(HTTP 协议):这是您的意大利面(传输响应)
  5. 你(浏览器):收到,开始享用(接收并处理)

在这个过程中:

  • 请求:你想要什么(请求内容)
  • 响应:餐厅给你什么(响应内容)
  • 协议:点餐的规则和流程(通信规范)

HTTP 的特点

1. 无状态(Stateless)

HTTP 本身不记忆之前的交互:

  • 每次请求都是独立的
  • 服务器不会自动记住你是谁
  • 就像每次点餐都要重新告诉服务员你要什么

解决方案

  • Cookie:在浏览器中存储小数据
  • Session:在服务器中存储用户会话
  • Token:使用令牌标识用户身份

2. 基于请求-响应模型

  • 客户端主动发起请求
  • 服务器被动响应请求
  • 服务器不能主动推送信息(除非使用 WebSocket 等其他技术)

3. 基于 TCP/IP 协议

  • HTTP 建立在可靠的 TCP 连接之上
  • 保证数据传输的完整性和顺序
  • 数据包丢失会自动重传

4. 灵活可扩展

  • 可以传输任何类型的数据(HTML、JSON、图片、视频等)
  • 通过 Header 传递额外信息
  • 支持内容协商(客户端和服务器协商数据格式)

HTTP 请求

请求的组成部分

一个完整的 HTTP 请求包含三个部分:

1. 请求行(Request Line)

GET /products/laptop HTTP/1.1

包含:

  • 请求方法:GET(想要做什么)
  • 请求路径:/products/laptop(请求哪个资源)
  • 协议版本:HTTP/1.1(使用哪个版本的 HTTP)

2. 请求头(Request Headers)

Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/json
Accept-Language: zh-CN,en
Cookie: sessionId=abc123

包含请求的元数据:

  • Host:目标服务器域名
  • User-Agent:浏览器/客户端信息
  • Accept:客户端能接受的内容类型
  • Accept-Language:首选语言
  • Cookie:之前存储的 cookie 数据

3. 请求体(Request Body)

只在某些请求方法中存在(如 POST、PUT),包含要发送给服务器的数据:

json
{
  "username": "john",
  "email": "[email protected]",
  "age": 28
}

常用的 HTTP 请求方法

HTTP 定义了多种请求方法(也叫 HTTP 动词),每种方法有不同的语义:

GET - 获取资源

最常用的方法,用于获取数据:

  • 获取网页内容
  • 查询数据
  • 下载文件

特点

  • 数据通过 URL 传递(查询参数)
  • 幂等性:多次请求结果相同
  • 可以被缓存
  • 会被浏览器记录在历史中
  • 不应该用于修改数据

示例

GET /api/users?page=1&limit=10

获取第 1 页的 10 个用户

POST - 创建资源

用于提交数据,创建新资源:

  • 提交表单
  • 上传文件
  • 创建新记录

特点

  • 数据在请求体中
  • 非幂等:多次请求可能创建多个资源
  • 不会被缓存
  • 不会保存在历史记录中
  • 更安全(数据不在 URL 中)

示例

POST /api/users
Content-Type: application/json

{
  "name": "Jane Smith",
  "email": "[email protected]"
}

创建一个新用户

PUT - 更新资源

用于更新已存在的资源:

  • 更新用户信息
  • 修改文章内容

特点

  • 完整替换资源
  • 幂等性:多次请求结果相同
  • 需要提供完整的资源数据

示例

PUT /api/users/123
Content-Type: application/json

{
  "name": "Jane Doe",
  "email": "[email protected]",
  "age": 30
}

更新 ID 为 123 的用户的所有信息

PATCH - 部分更新

用于部分更新资源:

  • 只修改某些字段

特点

  • 只需提供要修改的字段
  • 比 PUT 更节省带宽

示例

PATCH /api/users/123
Content-Type: application/json

{
  "email": "[email protected]"
}

只更新邮箱字段

DELETE - 删除资源

用于删除资源:

  • 删除用户
  • 删除文章
  • 删除订单

特点

  • 幂等性:删除后再删除,结果相同(资源不存在)
  • 通常不需要请求体

示例

DELETE /api/users/123

删除 ID 为 123 的用户

HEAD - 获取头部

与 GET 类似,但只返回响应头,不返回响应体:

  • 检查资源是否存在
  • 获取资源的元信息(大小、修改时间)
  • 检查链接是否有效

OPTIONS - 获取支持的方法

查询服务器支持哪些 HTTP 方法:

  • 用于 CORS 预检请求
  • 了解 API 的功能

请求方法的使用场景对比

方法用途幂等性安全性缓存
GET查询数据
POST创建数据
PUT完整更新
PATCH部分更新
DELETE删除数据
  • 幂等性:多次操作结果相同
  • 安全性:不会修改服务器数据
  • 缓存:响应可以被缓存

HTTP 响应

响应的组成部分

服务器返回的响应也包含三个部分:

1. 状态行(Status Line)

HTTP/1.1 200 OK

包含:

  • 协议版本:HTTP/1.1
  • 状态码:200(请求结果)
  • 状态描述:OK(状态说明)

2. 响应头(Response Headers)

Content-Type: text/html; charset=utf-8
Content-Length: 1234
Cache-Control: max-age=3600
Set-Cookie: sessionId=xyz789
Server: nginx/1.18.0

包含响应的元数据:

  • Content-Type:响应内容的类型
  • Content-Length:内容长度(字节)
  • Cache-Control:缓存控制
  • Set-Cookie:要求浏览器存储 cookie
  • Server:服务器软件信息

3. 响应体(Response Body)

实际的响应内容:

html
<!DOCTYPE html>
<html>
  <head>
    <title>Welcome</title>
  </head>
  <body>
    <h1>Hello, World!</h1>
  </body>
</html>

HTTP 状态码

状态码告诉客户端请求的结果,分为 5 大类:

1xx - 信息响应(Informational)

临时响应,较少使用:

  • 100 Continue:继续发送请求的剩余部分
  • 101 Switching Protocols:切换协议(如升级到 WebSocket)

2xx - 成功响应(Success)

请求成功处理:

  • 200 OK:最常见,请求成功
  • 201 Created:资源创建成功(常用于 POST)
  • 204 No Content:成功但无内容返回(常用于 DELETE)
  • 206 Partial Content:部分内容(用于断点续传)

3xx - 重定向(Redirection)

需要进一步操作:

  • 301 Moved Permanently:永久重定向
    • 网站更换域名
    • 搜索引擎会更新索引
  • 302 Found:临时重定向
    • 临时页面跳转
    • 搜索引擎不会更新索引
  • 304 Not Modified:资源未修改,使用缓存
    • 节省带宽
    • 加快加载速度
  • 307 Temporary Redirect:临时重定向(保持请求方法不变)
  • 308 Permanent Redirect:永久重定向(保持请求方法不变)

4xx - 客户端错误(Client Error)

请求有问题:

  • 400 Bad Request:请求格式错误
    • 参数缺失
    • JSON 格式错误
  • 401 Unauthorized:未认证
    • 需要登录
    • Token 无效
  • 403 Forbidden:无权限
    • 已登录但权限不足
    • IP 被封禁
  • 404 Not Found:资源不存在
    • URL 错误
    • 资源已删除
  • 405 Method Not Allowed:方法不允许
    • 对只读 API 使用 POST
  • 409 Conflict:请求冲突
    • 重复提交
    • 数据版本冲突
  • 429 Too Many Requests:请求过多
    • 被限流
    • 超过 API 调用次数

5xx - 服务器错误(Server Error)

服务器处理失败:

  • 500 Internal Server Error:服务器内部错误
    • 代码 bug
    • 未处理的异常
  • 502 Bad Gateway:网关错误
    • 上游服务器错误
    • 代理服务器无法连接
  • 503 Service Unavailable:服务不可用
    • 服务器维护
    • 服务器过载
  • 504 Gateway Timeout:网关超时
    • 上游服务器响应太慢

常见状态码使用场景

成功场景

浏览器:GET /products
服务器:200 OK(返回产品列表)

浏览器:POST /products(创建新产品)
服务器:201 Created(产品创建成功)

浏览器:DELETE /products/123
服务器:204 No Content(删除成功,无内容返回)

重定向场景

浏览器:GET /old-page
服务器:301 Moved Permanently
        Location: /new-page
浏览器自动跳转到新页面

错误场景

浏览器:GET /api/users(未登录)
服务器:401 Unauthorized(需要先登录)

浏览器:GET /not-exist
服务器:404 Not Found(页面不存在)

浏览器:POST /admin/delete(普通用户)
服务器:403 Forbidden(无权限)

HTTPS:安全的 HTTP

为什么需要 HTTPS?

普通的HTTP 是明文传输的,就像在明信片上写信,任何人都能看到内容:

HTTP 的安全问题

  1. 窃听:第三方可以截获并查看数据
  2. 篡改:数据可能在传输过程中被修改
  3. 冒充:无法确认服务器的真实身份

HTTPS 解决了这些问题

  • 加密:数据经过加密,无法直接阅读
  • 完整性:检测数据是否被篡改
  • 认证:通过证书验证服务器身份

HTTPS 如何工作?

HTTPS = HTTP + SSL/TLS

SSL/TLS(安全套接层/传输层安全)提供加密通道:

建立连接的过程(简化版):

  1. 浏览器请求连接
浏览器:你好,我想建立安全连接
  1. 服务器发送证书
服务器:这是我的证书,证明我的身份
证书包含:
  - 网站信息
  - 公钥
  - 证书颁发机构签名
  1. 浏览器验证证书
浏览器检查:
  ✓ 证书是否由可信机构颁发?
  ✓ 证书是否在有效期内?
  ✓ 证书域名是否匹配?
  1. 协商加密方式
浏览器和服务器:
  - 选择加密算法
  - 生成会话密钥
  1. 开始加密通信
之后的所有通信都使用会话密钥加密

HTTPS 的优势

安全性

  • 数据加密传输
  • 防止中间人攻击
  • 验证服务器身份

信任度

  • 浏览器显示锁图标
  • 用户更信任 HTTPS 网站
  • 搜索引擎给予更高排名

功能支持

  • 许多现代 Web API 要求 HTTPS
  • PWA(渐进式 Web 应用)必须使用 HTTPS
  • HTTP/2 协议要求 HTTPS

HTTP vs HTTPS 对比

特性HTTPHTTPS
安全性明文传输加密传输
端口80443
证书不需要需要 SSL/TLS 证书
速度快一点点慢一点点(加密开销)
SEO普通搜索引擎优先
成本免费证书有免费和付费

现代 Web 开发强烈推荐使用 HTTPS,免费证书服务(如 Let's Encrypt)让 HTTPS 普及变得容易。

HTTP 版本演进

HTTP/1.0(1996 年)

特点

  • 每个请求需要建立新的 TCP 连接
  • 连接完成后立即关闭

问题

  • 性能差:频繁建立连接开销大
  • 不支持持久连接

HTTP/1.1(1997 年)

改进

  • 持久连接:一个 TCP 连接可以发送多个请求
  • 管道化:可以同时发送多个请求(但响应仍需按顺序)
  • 分块传输:支持流式传输
  • 缓存控制:更强大的缓存机制

仍存在的问题

  • 队头阻塞:前面的请求阻塞后面的请求
  • 头部冗余:每次请求都发送重复的头部信息

HTTP/2(2015 年)

重大改进

  • 二进制协议:更高效的解析
  • 多路复用:同一连接可以并行处理多个请求
  • 头部压缩:减少冗余数据
  • 服务器推送:服务器可以主动推送资源

优势

  • 显著提升性能
  • 减少延迟
  • 更好的资源利用

HTTP/3(2022 年)

基于 QUIC 协议

  • 建立在 UDP 之上(而非 TCP)
  • 更快的连接建立
  • 更好的拥塞控制
  • 改善的移动网络体验

总结

HTTP 协议核心要点

  1. HTTP 是 Web 通信的基础:定义了浏览器和服务器如何交换信息

  2. 请求-响应模型:客户端发起请求,服务器返回响应

  3. 多种请求方法

    • GET:查询数据
    • POST:创建数据
    • PUT/PATCH:更新数据
    • DELETE:删除数据
  4. 状态码传达结果

    • 2xx:成功
    • 3xx:重定向
    • 4xx:客户端错误
    • 5xx:服务器错误
  5. HTTPS 保障安全:通过 SSL/TLS 加密,保护数据传输

  6. 协议持续演进:从 HTTP/1.0 到 HTTP/3,性能不断提升

实践建议

  • 使用浏览器开发者工具的 Network 面板观察 HTTP 请求
  • 理解不同状态码的含义,便于调试问题
  • 现代 Web 开发优先使用 HTTPS
  • 根据操作类型选择合适的 HTTP 方法
  • 关注 HTTP/2 和 HTTP/3 带来的性能提升

理解 HTTP 协议是前端开发的必备知识,它帮助你更好地与后端协作,优化应用性能,解决实际问题。