HTTP 方法详解:GET、POST、PUT、DELETE 及更多 (2026)
HTTP 请求方法的完整参考指南
开始使用 Hypereal 构建
通过单个 API 访问 Kling、Flux、Sora、Veo 等。免费积分开始,扩展到数百万。
无需信用卡 • 10万+ 开发者 • 企业级服务
HTTP 方法详解:GET、POST、PUT、DELETE 等 (2026)
HTTP 方法(也称为 HTTP 谓词)定义了您希望对资源执行的操作。每个 API 请求都会使用一个 HTTP 方法,选择正确的方法对于构建正确、安全且符合标准的 Web API 至关重要。
本指南涵盖了所有九种标准 HTTP 方法、每种方法的使用场景,以及用于构建和调用 API 的实际代码示例。
快速参考表
| 方法 | 用途 | 请求体 | 响应体 | 安全性 | 幂等性 | 可缓存性 |
|---|---|---|---|---|---|---|
| GET | 读取资源 | 否 | 是 | 是 | 是 | 是 |
| POST | 创建资源 | 是 | 是 | 否 | 否 | 否 |
| PUT | 替换资源 | 是 | 可选 | 否 | 是 | 否 |
| PATCH | 部分更新 | 是 | 是 | 否 | 否 | 否 |
| DELETE | 删除资源 | 可选 | 可选 | 否 | 是 | 否 |
| HEAD | 仅获取请求头 | 否 | 否 | 是 | 是 | 是 |
| OPTIONS | 获取允许的方法 | 否 | 是 | 是 | 是 | 否 |
| TRACE | 回显请求 | 否 | 是 | 是 | 是 | 否 |
| CONNECT | 建立隧道 | 否 | 否 | 否 | 否 | 否 |
关键术语
- 安全性 (Safe):不修改资源。调用时不会产生副作用。
- 幂等性 (Idempotent):多次调用产生的结果与调用一次相同。
- 可缓存性 (Cacheable):响应可以被浏览器和 CDN 存储并重用。
GET
GET 方法用于获取资源。它是最常见的 HTTP 方法,每当您打开网页、获取 API 数据或加载图片时都会用到它。
规则
- 不得包含请求体(技术上允许,但 RFC 9110 不推荐)。
- 不得修改服务器状态。
- 应当是幂等且安全的。
- 响应可以被缓存。
示例
# 获取用户列表
curl -X GET https://api.example.com/users
# 获取特定用户
curl -X GET https://api.example.com/users/42
# 带有查询参数
curl -X GET "https://api.example.com/users?page=2&limit=10"
// JavaScript Fetch API
const response = await fetch('https://api.example.com/users/42');
const user = await response.json();
# Python Requests
import requests
response = requests.get('https://api.example.com/users/42')
user = response.json()
常见响应代码
| 代码 | 含义 |
|---|---|
| 200 OK | 资源获取成功 |
| 304 Not Modified | 缓存版本仍然有效 |
| 404 Not Found | 资源不存在 |
POST
POST 方法用于创建新资源或触发服务器端操作。它是最灵活的 HTTP 方法,适用于除简单检索之外的任何操作。
规则
- 包含包含要创建的数据的请求体。
- 非幂等——调用两次 POST 会创建两个资源。
- 不安全——它会修改服务器状态。
- 服务器通常返回创建的资源并带有 201 状态码。
示例
# 创建新用户
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name": "Alice", "email": "alice@example.com"}'
const response = await fetch('https://api.example.com/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Alice', email: 'alice@example.com' }),
});
const newUser = await response.json();
response = requests.post(
'https://api.example.com/users',
json={'name': 'Alice', 'email': 'alice@example.com'}
)
new_user = response.json()
常见响应代码
| 代码 | 含义 |
|---|---|
| 201 Created | 资源创建成功 |
| 400 Bad Request | 请求体中数据无效 |
| 409 Conflict | 资源已存在(例如:重复的邮箱) |
| 422 Unprocessable Entity | 语法正确但存在语义错误 |
PUT
PUT 方法使用提供的数据替换整个资源。如果资源不存在,某些 API 会创建它(即 upsert 行为)。
规则
- 请求体中需要完整的资源数据。
- 是幂等的——使用相同数据多次调用 PUT 效果相同。
- 替换整个资源,而不仅仅是特定字段。
PUT vs. PATCH
这是 API 设计中最容易混淆的点之一:
| 维度 | PUT | PATCH |
|---|---|---|
| 发送内容 | 完整的资源 | 仅修改的字段 |
| 缺失字段 | 设置为 null/默认值 | 保持不变 |
| 幂等性 | 是 | 不一定 |
| 使用场景 | 全量替换 | 部分更新 |
示例
# 完全替换用户
curl -X PUT https://api.example.com/users/42 \
-H "Content-Type: application/json" \
-d '{"name": "Alice Updated", "email": "alice@new.com", "age": 30}'
const response = await fetch('https://api.example.com/users/42', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
name: 'Alice Updated',
email: 'alice@new.com',
age: 30
}),
});
response = requests.put(
'https://api.example.com/users/42',
json={'name': 'Alice Updated', 'email': 'alice@new.com', 'age': 30}
)
常见响应代码
| 代码 | 含义 |
|---|---|
| 200 OK | 资源替换成功 |
| 201 Created | 资源不存在且已创建 |
| 204 No Content | 替换成功,未返回响应体 |
| 404 Not Found | 资源不存在(如果不支持 upsert) |
PATCH
PATCH 方法对资源应用部分修改。您只需发送想要更改的字段,其他内容保持不变。
规则
- 仅包含正在修改的字段。
- 不一定是幂等的(取决于具体实现)。
- 对于微小更改,比 PUT 更节省带宽。
示例
# 仅更新用户的邮箱
curl -X PATCH https://api.example.com/users/42 \
-H "Content-Type: application/json" \
-d '{"email": "alice@new.com"}'
const response = await fetch('https://api.example.com/users/42', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email: 'alice@new.com' }),
});
response = requests.patch(
'https://api.example.com/users/42',
json={'email': 'alice@new.com'}
)
JSON Patch 格式
某些 API 使用正式的 JSON Patch 格式 (RFC 6902) 而不是普通的 JSON 体:
curl -X PATCH https://api.example.com/users/42 \
-H "Content-Type: application/json-patch+json" \
-d '[
{"op": "replace", "path": "/email", "value": "alice@new.com"},
{"op": "add", "path": "/phone", "value": "+1234567890"}
]'
DELETE
DELETE 方法从服务器删除资源。
规则
- 是幂等的——删除一个已经删除的资源不应报错(返回 204 或 404)。
- 可能有也可能没有请求体(大多数 API 不使用)。
- 成功删除通常返回 204 No Content。
示例
# 删除用户
curl -X DELETE https://api.example.com/users/42
const response = await fetch('https://api.example.com/users/42', {
method: 'DELETE',
});
response = requests.delete('https://api.example.com/users/42')
常见响应代码
| 代码 | 含义 |
|---|---|
| 200 OK | 已删除,响应体包含被删除的资源 |
| 204 No Content | 删除成功,无响应体 |
| 404 Not Found | 资源不存在 |
| 409 Conflict | 无法删除(例如:存在关联资源) |
HEAD
HEAD 方法与 GET 完全相同,但仅返回响应头,不返回响应体。它用于检查资源是否存在、获取其大小或检查其最后修改日期,而无需下载完整内容。
示例
# 检查文件是否存在并获取其大小
curl -I https://example.com/large-file.zip
响应:
HTTP/2 200
Content-Type: application/zip
Content-Length: 524288000
Last-Modified: Mon, 03 Feb 2026 10:00:00 GMT
使用场景
- 在下载前检查资源是否存在
- 获取
Content-Length以估算下载时间 - 检查
Last-Modified或ETag进行缓存验证 - 验证 URL 重定向而无需下载
OPTIONS
OPTIONS 方法返回服务器针对给定 URL 支持的 HTTP 方法。它最常见于 CORS 预检请求中。
示例
curl -X OPTIONS https://api.example.com/users -i
响应:
HTTP/2 204
Allow: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
CORS 预检
浏览器在某些跨域请求之前会自动发送 OPTIONS 请求。这被称为预检请求 (Preflight request):
Browser -> OPTIONS /api/users (预检)
Server <- 204 带 CORS 头部
Browser -> POST /api/users (实际请求)
Server <- 201 Created
TRACE
TRACE 方法将收到的请求回显给客户端。它用于调试,以查看请求在经过中间代理时被修改了什么。
curl -X TRACE https://example.com
出于安全考虑(它可能向攻击者暴露 Cookie 等头部信息),TRACE 通常在生产环境服务器上禁用。
CONNECT
CONNECT 方法建立通往服务器的隧道,通常用于通过 HTTP 代理进行 HTTPS 连接。您在应用程序代码中很少直接使用它。
CONNECT api.example.com:443 HTTP/1.1
Host: api.example.com
使用 HTTP 方法设计 RESTful API
以下是 HTTP 方法如何映射到标准的 CRUD 操作:
| 操作 | HTTP 方法 | 端点 | 示例 |
|---|---|---|---|
| 列出所有 | GET | /users | 获取所有用户 |
| 获取单个 | GET | /users/:id | 获取用户 42 |
| 创建 | POST | /users | 创建新用户 |
| 替换 | PUT | /users/:id | 替换用户 42 |
| 更新 | PATCH | /users/:id | 更新用户 42 的邮箱 |
| 删除 | DELETE | /users/:id | 删除用户 42 |
Express.js 示例
const express = require('express');
const app = express();
app.use(express.json());
// GET /users - 列出所有用户
app.get('/users', (req, res) => {
res.json(users);
});
// GET /users/:id - 获取单个用户
app.get('/users/:id', (req, res) => {
const user = users.find(u => u.id === req.params.id);
if (!user) return res.status(404).json({ error: 'Not found' });
res.json(user);
});
// POST /users - 创建用户
app.post('/users', (req, res) => {
const user = { id: generateId(), ...req.body };
users.push(user);
res.status(201).json(user);
});
// PUT /users/:id - 替换用户
app.put('/users/:id', (req, res) => {
const index = users.findIndex(u => u.id === req.params.id);
if (index === -1) return res.status(404).json({ error: 'Not found' });
users[index] = { id: req.params.id, ...req.body };
res.json(users[index]);
});
// PATCH /users/:id - 部分更新
app.patch('/users/:id', (req, res) => {
const user = users.find(u => u.id === req.params.id);
if (!user) return res.status(404).json({ error: 'Not found' });
Object.assign(user, req.body);
res.json(user);
});
// DELETE /users/:id - 删除用户
app.delete('/users/:id', (req, res) => {
const index = users.findIndex(u => u.id === req.params.id);
if (index === -1) return res.status(404).json({ error: 'Not found' });
users.splice(index, 1);
res.status(204).send();
});
常见错误
将 GET 用于修改数据的操作: GET 永远不应更改服务器状态。对于发送电子邮件、处理付款或触发工作流等操作,请使用 POST。
对所有操作都使用 POST: 虽然 POST 可以胜任任何操作,但使用正确的方法会使您的 API 具有可预测性且自描述。
在想要使用 PATCH 时使用了 PUT: 如果您只更新一个字段,请使用 PATCH。PUT 应该替换整个资源。
未返回正确的状态码: POST 返回 201(而非 200),DELETE 返回 204(而非 200),资源未找到时返回 404(而非返回 200 带有错误消息)。
总结
HTTP 方法是每个 Web API 的基石。正确使用它们可以使您的 API 具备可预测性、可缓存性且符合标准。GET 用于读取,POST 用于创建,PUT 用于替换,PATCH 用于更新,DELETE 用于删除——掌握这五个方法,您就能涵盖 99% 的 API 设计需求。
如果您正在构建通过 API 使用 AI 生成媒体(图像、视频、音频或真人头像)的应用程序,请查看 Hypereal AI,它提供了一个采用标准 HTTP 方法和清晰响应格式的统一 REST API。
免费试用 Hypereal AI —— 35 个积分,无需信用卡。
