我们使用 HTTP 协议在 Web 服务器上触发异步操作,稍后在后台从另一台服务器加载数据并将其写入我们服务器的数据库中。
┌──────┐ ┌──────┐ ┌───────────┐
│client│ │server│ │data-source│
└──┬───┘ └──┬───┘ └─────┬─────┘
│ │ │
│ ?METHOD? /sync-data │ │
│────────────────────→│ │
│ │ │
│ 202 ACCEPTED │ │
│←────────────────────│ │
│ │ │
│ │ Fetch data │
│ │───────────→│
│ │ │
│ │ [data] │
│ │←───────────│
│ │ │
│ │───────╮ │
│ │ Store │ │
│ │ data │ │
│ │←──────╯ │
│ │ │
┌──┴───┐ ┌──┴───┐ ┌─────┴─────┐
│client│ │server│ │data-source│
└──────┘ └──────┘ └───────────┘
(来自 ASCII 序列图在线工具:https://arthursonzogni.com/Diagon/#Sequence)
问题是,哪种HTTP方法最适合调用?
我收集了支持和反对每种方法的论据。
方法 | 正常用途 | 为什么在我的案例中使用它 | 为什么不 |
---|---|---|---|
获取 | 读取数据 | • 请求不会 立即 更改服务器状态 • 没有主体 • 最简单的测试 |
• 最终 服务器状态发生了变化 |
发帖 | 创建一个新对象 | • 这是用于更改的常用方法 | • 触发的异步动作的特点不是Create • 方法返回后,服务器状态尚未改变 |
放置 | 替换现有对象 | • 听起来不错,但是... | • 将替换服务器数据的数据不是本次请求的一部分 • 方法返回后,服务器状态尚未改变 |
删除 | 删除现有对象 | 不适用 | 不适用 |
补丁 | 部分更新现有对象 | 不适用 | • 我们没有更改“记录的某些字段” • 将替换服务器数据的数据不是此请求的一部分 • 方法返回后,服务器状态尚未更改 |
问题是,哪种 HTTP 方法最适合调用?
POST
您认为
POST
方法的“正常目的是创建新对象”的观念是错误的。
实际上,当前 HTTP 规范(RFC 9110,2022 年 6 月)如此描述POST
(强调我的):
POST
方法请求目标资源根据资源自身的特定语义
处理请求中包含的表示。