什么是HTTP?HTTP的请求方法与状态码

HTTP 是互联网世界中最基础、最关键的通信协议之一,它定义了浏览器与服务器之间如何交换数据,是网页加载、图片展示、视频播放、接口通信等一切网络行为的核心规则。可以说,没有 HTTP,就没有我们今天熟悉的互联网体验:从打开一个网页、查看天气、刷社交媒体,到在线购物、移动支付,所有的内容都是通过 HTTP 在全球范围内被可靠、高效地传递。
它像互联网的“通用语言”和“运输系统”,让无数不同的设备、系统和服务能够协同工作、无缝连接,使互联网得以形成庞大且互联的生态。HTTP 的发展(从 1.0 到 3.0)也不断推动网络速度、安全性和稳定性的提升,成为现代数字世界运行不可或缺的基础设施。
基础概念
什么是 HTTP
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(如 HTML)的应用层协议。它是万维网(World Wide Web)数据通信的基础。
核心特点:
- • 简单:HTTP 消息易于阅读和理解
- • 可扩展:通过 Header 可以轻松扩展功能
- • 无状态:每个请求都是独立的
- • 基于 TCP/IP:在可靠的传输层之上工作
历史发展:
1991 年:HTTP/0.9 诞生,只支持 GET 方法1996 年:HTTP/1.0 发布,增加了 Header 和状态码1997 年:HTTP/1.1 发布,支持持久连接2015 年:HTTP/2 发布,引入二进制分帧2022 年:HTTP/3 标准化,基于 QUIC 协议HTTP 的工作原理
HTTP 遵循经典的客户端-服务器模型:
客户端(浏览器) 服务器 | | |------ HTTP 请求 ----------------->| | | 处理请求 | | 查找资源 |<----- HTTP 响应 -------------------| | | 显示内容 完整的通信流程:
- 1. 客户端发起 DNS 查询,获取服务器 IP
- 2. 建立 TCP 连接(三次握手)
- 3. 客户端发送 HTTP 请求
- 4. 服务器处理请求并返回 HTTP 响应
- 5. 客户端接收响应并渲染内容
- 6. 关闭 TCP 连接(四次挥手)或保持连接(Keep-Alive)
HTTP 消息结构
HTTP 请求结构:
GET /index.html HTTP/1.1 ← 请求行Host: www.example.com ← Header 部分User-Agent: Mozilla/5.0Accept: text/htmlConnection: keep-alive ← 空行(分隔符)请求体(可选) ← Body 部分HTTP 响应结构:
HTTP/1.1 200 OK ← 状态行Content-Type: text/html ← Header 部分Content-Length: 1234Date: Mon, 20 Nov 2024 12:00:00 GMT ← 空行(分隔符)<html> ← Body 部分 <body>Hello World</body></html>HTTP 的特性
1. 无状态性
HTTP 本身不会保留之前的请求和响应信息。每个请求都是独立的。
优点:
- • 服务器不需要保存状态信息
- • 减轻服务器负担
- • 易于扩展
缺点:
- • 需要额外机制(Cookie、Session)来维持状态
- • 每次请求都需要传输完整的信息
2. 持久连接(HTTP/1.1+)
在 HTTP/1.1 中引入了持久连接(Persistent Connection),也称为 Keep-Alive。
传统方式(HTTP/1.0):请求 1 → 响应 1 → 关闭连接请求 2 → 响应 2 → 关闭连接(每次请求都要建立新连接)持久连接(HTTP/1.1):请求 1 → 响应 1请求 2 → 响应 2请求 3 → 响应 3(一个连接可以发送多个请求)3. 管道化(Pipelining)
HTTP/1.1 支持管道化,允许在同一个连接上同时发送多个请求,无需等待响应。
客户端:请求 1 → 请求 2 → 请求 3服务器: ← 响应 1 ← 响应 2 ← 响应 3(按顺序返回响应)4. 可扩展性
通过自定义 Header 可以轻松扩展 HTTP 功能。
X-Custom-Header: custom-valueX-Request-ID: 12345X-API-Version: v2HTTP 请求方法
常用方法详解
GET
获取资源,最常用的方法。
GET /api/users/123 HTTP/1.1Host: example.com特点:
- • 参数在 URL 中(查询字符串)
- • 可以被缓存
- • 可以被收藏为书签
- • 长度有限制(浏览器和服务器限制)
- • 幂等操作(多次请求结果相同)
POST
提交数据到服务器,常用于创建资源。
POST /api/users HTTP/1.1Host: example.comContent-Type: application/json{ "name": "John", "email": "john@example.com"}特点:
- • 参数在请求体中
- • 不会被缓存
- • 不能被收藏为书签
- • 长度理论上无限制
- • 非幂等操作(多次请求可能产生不同结果)
PUT
更新资源,用整个资源替换。
PUT /api/users/123 HTTP/1.1Host: example.comContent-Type: application/json{ "name": "John Updated", "email": "john.new@example.com", "age": 30}特点:
- • 幂等操作
- • 通常用于完整更新资源
- • 如果资源不存在,可以创建
PATCH
部分更新资源。
PATCH /api/users/123 HTTP/1.1Host: example.comContent-Type: application/json{ "email": "john.new@example.com"}特点:
- • 只更新指定的字段
- • 节省带宽
- • 非幂等操作
DELETE
删除资源。
DELETE /api/users/123 HTTP/1.1Host: example.com特点:
- • 幂等操作
- • 删除指定资源
HEAD
与 GET 类似,但只返回 Header,不返回 Body。
HEAD /api/users/123 HTTP/1.1Host: example.com用途:
- • 检查资源是否存在
- • 获取资源的元信息(大小、修改时间)
- • 检查链接有效性
OPTIONS
查询服务器支持的方法。
OPTIONS /api/users HTTP/1.1Host: example.com响应:
HTTP/1.1 200 OKAllow: GET, POST, PUT, DELETE, OPTIONSAccess-Control-Allow-Methods: GET, POST, PUT, DELETE用途:
- • CORS 预检请求
- • 查询服务器能力
CONNECT
建立隧道连接,用于 HTTPS 代理。
CONNECT www.example.com:443 HTTP/1.1Host: www.example.comTRACE
回显服务器收到的请求,用于诊断。
TRACE /api/test HTTP/1.1Host: example.com注意:由于安全问题,TRACE 通常被禁用。
各方法对比
| 方法 | 幂等 | 安全 | 可缓存 | 请求体 | 响应体 | 主要用途 |
|---|---|---|---|---|---|---|
| GET | 是 | 是 | 是 | 否 | 是 | 获取资源 |
| POST | 否 | 否 | 可 | 是 | 是 | 创建资源 |
| PUT | 是 | 否 | 否 | 是 | 可 | 完整更新 |
| PATCH | 否 | 否 | 否 | 是 | 可 | 部分更新 |
| DELETE | 是 | 否 | 否 | 可 | 可 | 删除资源 |
| HEAD | 是 | 是 | 是 | 否 | 否 | 获取元信息 |
| OPTIONS | 是 | 是 | 否 | 否 | 是 | 查询能力 |
幂等性:多次执行产生相同的结果安全性:不会修改资源状态
RESTful API 设计
REST(Representational State Transfer)是一种架构风格,用于构建网络服务,它利用 HTTP 协议作为底层通信机制,并在此基础上定义了特定的设计原则和约束条件。RESTful API 使用 HTTP 方法来执行操作,但它不仅仅是对 HTTP 方法命名的引用,而是通过遵循一些基本的设计原则(如资源的表现、无状态、统一接口等)来规范 API 的结构和行为。
使用 HTTP 方法设计 RESTful API:
资源:用户(users)GET /users # 获取用户列表GET /users/123 # 获取特定用户POST /users # 创建新用户PUT /users/123 # 完整更新用户PATCH /users/123 # 部分更新用户DELETE /users/123 # 删除用户资源:用户的订单(users/123/orders)GET /users/123/orders # 获取用户的订单列表GET /users/123/orders/456 # 获取特定订单POST /users/123/orders # 为用户创建订单DELETE /users/123/orders/456 # 删除特定订单HTTP 状态码
状态码分类
状态码由 3 位数字组成,第一位定义了响应的类别:
1xx:信息性状态码(Informational)2xx:成功状态码(Success)3xx:重定向状态码(Redirection)4xx:客户端错误状态码(Client Error)5xx:服务器错误状态码(Server Error)常用状态码详解
1xx 信息性状态码
100 Continue
客户端应继续其请求通常用于客户端发送 Expect: 100-continue101 Switching Protocols
服务器正在切换协议常见于 WebSocket 升级示例:
HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: Upgrade2xx 成功状态码
200 OK
请求成功最常见的状态码201 Created
资源已创建常用于 POST 请求成功后示例:
HTTP/1.1 201 CreatedLocation: /api/users/124Content-Type: application/json{ "id": 124, "name": "John"}204 No Content
请求成功,但没有返回内容常用于 DELETE 请求206 Partial Content
部分内容用于断点续传示例:
HTTP/1.1 206 Partial ContentContent-Range: bytes 0-1023/5000Content-Length: 10243xx 重定向状态码
301 Moved Permanently
永久重定向搜索引擎会更新索引示例:
HTTP/1.1 301 Moved PermanentlyLocation: https://www.example.com/new-page302 Found
临时重定向搜索引擎不会更新索引304 Not Modified
资源未修改可以使用缓存版本示例:
请求:GET /image.jpg HTTP/1.1If-Modified-Since: Mon, 01 Jan 2024 00:00:00 GMT响应:HTTP/1.1 304 Not Modified307 Temporary Redirect
临时重定向保持请求方法不变308 Permanent Redirect
永久重定向保持请求方法不变4xx 客户端错误状态码
400 Bad Request
请求语法错误服务器无法理解请求401 Unauthorized
未授权需要身份认证示例:
HTTP/1.1 401 UnauthorizedWWW-Authenticate: Bearer realm="example"403 Forbidden
禁止访问服务器拒绝请求404 Not Found
资源不存在最常见的错误状态码405 Method Not Allowed
方法不允许例如对只读资源使用 POST示例:
HTTP/1.1 405 Method Not AllowedAllow: GET, HEAD408 Request Timeout
请求超时服务器等待请求超时409 Conflict
请求冲突例如版本冲突410 Gone
资源已永久删除比 404 更明确413 Payload Too Large
请求体过大超过服务器限制414 URI Too Long
URI 过长通常是 GET 请求 URL 太长415 Unsupported Media Type
不支持的媒体类型例如发送 XML 但服务器只接受 JSON429 Too Many Requests
请求过多触发限流示例:
HTTP/1.1 429 Too Many RequestsRetry-After: 3600X-RateLimit-Limit: 1000X-RateLimit-Remaining: 05xx 服务器错误状态码
500 Internal Server Error
服务器内部错误通用错误响应501 Not Implemented
功能未实现服务器不支持该请求方法502 Bad Gateway
网关错误代理服务器从上游服务器收到无效响应503 Service Unavailable
服务不可用服务器暂时无法处理请求示例:
HTTP/1.1 503 Service UnavailableRetry-After: 120504 Gateway Timeout
网关超时代理服务器等待上游服务器响应超时状态码最佳实践
选择合适的状态码:
// 成功创建资源return res.status(201).json({ id: newUser.id });// 成功删除,无返回内容return res.status(204).send();// 资源不存在return res.status(404).json({ error: "User not found" });// 验证失败return res.status(400).json({ error: "Invalid email format" });// 未授权return res.status(401).json({ error: "Authentication required" });// 权限不足return res.status(403).json({ error: "Insufficient permissions" });// 服务器错误return res.status(500).json({ error: "Internal server error" });本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。



