HTTP、方法与 Web API
TL;DR(太长不看) HTTP 是 Web 的语言;它的动词(方法)就是让客户端和服务器相互理解的语法。选对动词,发送正确的请求头,你的 API 就能运转自如。无视规则,各种怪问题就会冒出来。本文解释其中的原因和方法——从原始请求字节,一直讲到 Divooka 中实用的可视化编程工作流。
1. 深入了解
我们已经介绍过使用和设计 REST API 的基础知识。现在我们来深入细节:
- 开发者将了解该使用哪种方法(GET、POST 等),以及为什么。
- 测试人员 / QA 将看到如何在 Postman/Insomnia 风格的节点图中重现真实世界的流量。
- 非开发人员的团队成员将对“安全”调用与“破坏性”调用建立直观认识(这样他们就不会再问“我们不能所有地方都用 POST 吗?”)。
2. HTTP 基础(10 分钟复习)
2.1 HTTP 究竟是什么?
- 一种无状态、基于文本的请求/响应协议,运行在 TCP 之上(HTTP/3 则运行在 QUIC 之上)。
- 一个连接 → 一个请求 → 一个响应(HTTP/2 中支持多路复用,但概念上是一样的)。
2.2 三层“三明治”
<Request / Status Line>
<Header 1: value>
<Header 2: value>
...
<BLANK LINE>
<Optional Body>
那个空行(\r\n\r\n)就是秘诀所在:它告诉所有人“请求头结束了,正文开始了”。
2.3 理解:安全性 • 幂等性 • 可缓存性
在使用 HTTP 方法时,了解三个影响请求行为的关键属性会很有帮助——尤其是在你构建流程、重试操作或缓存响应的时候。
🔹 安全方法
这些方法是只读的——它们不会更改服务器上的任何内容。你可以随意多次调用,而没有任何风险。
- 示例:
GET、HEAD、OPTIONS - 用途: 安全方法非常适合预取或检查数据,不会产生副作用。
🔹 幂等方法
这些方法可能会更改内容,但执行多次与执行一次的效果相同。
- 示例:
GET、PUT、DELETE、HEAD、OPTIONS - 用途: 非常适合重试——如果网络故障导致请求被重复发送,你也不会意外地创建或删除多个对象。
🔹 可缓存方法
对于这些方法,响应可以由浏览器或代理服务器安全地存储(缓存)。
- 示例:
GET(最常见),有时也包括HEAD - 用途: 避免为相同的数据重复调用,让你的应用更快、更轻量。
快速总结:
| 属性 | 含义 | 常见方法 |
|---|---|---|
| 安全 | 不更改数据 | GET、HEAD、OPTIONS |
| 幂等 | 无论发送多少次,结果都相同 | GET、PUT、DELETE、HEAD、OPTIONS |
| 可缓存 | 响应可以被存储以便复用 | GET(默认)、HEAD |
3. 原始 HTTP 消息格式(纯文本示例)
查看原始文本对我们有以下帮助:
- 了解真实情况: Divooka 中所有好用的“HTTP Request”节点,最终都会转换为通过 TCP 发送的纯文本流(外加
\r\n分隔符)。 - 强大的调试能力: 当出现问题时(例如请求头拼写错误或缺少空行),阅读原始消息可以帮助你准确找出问题所在。
- 学习的桥梁: 查看原始文本可以加深你对“请求行 → 请求头 → 空行 → 正文”如何对应到我们的可视化工具底层行为的理解。
3.1 原始 HTTP 请求剖析
示例:一个获取 JSON 资源的简单 GET 请求
GET /api/users/123 HTTP/1.1
Host: api.example.com
Accept: application/json
User-Agent: Divooka/1.0
Authorization: Bearer <token>
逐行解析:
GET /api/users/123 HTTP/1.1- 请求行:
<METHOD> <PATH> <HTTP-VERSION>。 - 这里,
GET请求获取 ID 为 123 的用户。 HTTP/1.1告诉服务器我们使用的是哪个版本的协议。
- 请求行:
Host: api.example.com- 在 HTTP/1.1 中是必需的,以便服务器知道你要访问的是哪个虚拟主机——当一台服务器托管多个域名时,这一点尤其重要。
Accept: application/json- “请返回 JSON。”如果省略,服务器通常会默认返回 HTML 或它自己的默认格式。
User-Agent: MyVisualTool/1.0- 标识客户端。Postman 或 Divooka 会发送类似
PostmanRuntime/7.28.4的值。
- 标识客户端。Postman 或 Divooka 会发送类似
Authorization: Bearer <token>- 发送 JWT 或 OAuth 2.0 令牌的常用方式。
- (空行)
- CRLF CRLF 分隔符: 两个连续的
\r\n序列标志着请求头的结束。如果没有它,服务器会一直等待更多的请求头行!
- CRLF CRLF 分隔符: 两个连续的
- (后面没有正文,因为 GET 通常不发送正文。)
3.2 原始 HTTP 响应剖析
示例:服务器对该 GET 请求的响应
HTTP/1.1 200 OK
Date: Mon, 02 Jun 2025 14:35:22 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 111
Cache-Control: no-cache, no-store
ETag: "5f4dcc3b..."
{
"id": 123,
"name": "Alice",
"email": "alice@example.com",
"created_at": "2025-05-20T08:15:00Z"
}
注意 Content-Length 必须等于 111 字节(即 JSON 负载的确切长度)。如果服务器使用 chunked(分块)编码以流式方式发送,它会省略 Content-Length,转而发送带有大小前缀的数据块。
逐行解析:
HTTP/1.1 200 OK- 状态行:
<HTTP-VERSION> <STATUS_CODE> <REASON_PHRASE>。 - 这里,
200 OK的意思是“成功,这是负载”。
- 状态行:
Date: Mon, 02 Jun 2025 14:35:22 GMT- 服务器的时钟。当你需要比较时间戳请求头或调试超时问题时很有用。
Content-Type: application/json; charset=utf-8- 告诉客户端如何解释正文。如果你的 Divooka 流程期望的是 text/html,你就会知道哪里出了问题。
Content-Length:1117- 随后正文的确切字节长度。如果没有它(或分块编码),客户端将无法知道正文在哪里结束。
Cache-Control: no-cache, no-store- 指示中间方(浏览器、CDN)不要缓存此响应。
ETag: "5f4dcc3b5aa765d61d8327deb882cf99"- 资源这一特定版本的标识符。之后,客户端可以在 GET 请求中发送
If-None-Match: "<etag>"来检查数据是否已更改。
- 资源这一特定版本的标识符。之后,客户端可以在 GET 请求中发送
- (空行)
- 表示“请求头结束了”。接下来的字节属于正文。
- 正文: 原始 JSON 负载,长度恰好为 97 字节(包括空白字符和换行符)。
{
"id": 123,
"name": "Alice",
"email": "[alice@example.com](mailto:alice@example.com)",
"created\_at": "2025-05-20T08:15:00Z"
}
3.4 发送带 JSON 正文的原始 POST 请求
下面是一个更详细的示例,展示带有 JSON 负载的 POST /contacts 在纯文本中是什么样子。请注意,Content-Length 请求头必须与正文的字节数一致(包括花括号、引号和换行符)。
POST /api/contacts HTTP/1.1
Host: api.example.com
User-Agent: MyVisualTool/1.0
Content-Type: application/json
Content-Length: 84
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6...
{
"first_name": "Bob",
"last_name": "Smith",
"email": "bob.smith@example.com"
}
- 请求头部分: • 前五行都是请求头或请求行。 • 空行之后的所有内容都是正文。 • 服务器在该空行之后恰好读取 84 个字节——不多也不少。
- 正文部分:
• JSON 负载在语法上必须有效(逗号、引号、花括号都要正确配对)。
• 如果你不小心输入了
Contnt-Length: 85,服务器会多等待一个字节,或者可能拒绝你的请求。
3.5 “分块”传输编码是什么样子
有些服务器会把较大的正文分成多段(“块”)发送,这样就不需要预先知道 Content-Length。分块响应看起来是这样的:
HTTP/1.1 200 OK
Date: Mon, 02 Jun 2025 15:00:00 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
1f <– hex length of first chunk: 31 bytes
{"page":1,"per_page":10,"total":42}
2a <– hex length of next chunk: 42 bytes
{"data":[{"id":1,...},{"id":2,...},...]}
0 <– “0” means “no more chunks”
- 分块编码的工作方式:
- 服务器发送一个十六进制数(例如
1f),后跟\r\n。这告诉你“接下来有 31 个字节”。 - 然后是接下来的 31 个字节数据(例如那个小 JSON 对象),后跟
\r\n。 - 然后是另一个十六进制数(
2a= 42 字节),依此类推。 - 最后的
0\r\n\r\n表示“全部发送完毕,谢谢”。
- 服务器发送一个十六进制数(例如
- 分块编码为什么重要:
• 你的 Divooka “HTTP Request”节点通常会隐藏这些细节,但如果你使用纯文本的“Raw Socket”节点,就会看到这些数据块一一传过来。
• 分块响应不包含
Content-Length请求头。客户端必须不断重组数据块,直到遇到长度为零的块为止。
3.6 常见陷阱
| 失误 | 症状 | 解决方法 |
|---|---|---|
| 忘记空行 | 立即返回“400 Bad Request” | 在请求头之后添加 \r\n\r\n |
Content-Length 错误 |
连接挂起或内容被截断 | 让你的客户端/工具来计算它 |
换行符混用(只有 \n) |
部分服务器会拒绝 | 在原始模式下始终使用 \r\n |
4 CRUD 与 HTTP 方法
CRUD 代表:
- Create(创建):添加新的记录或资源(例如创建用户账户)。
- Read(读取):检索或查看现有数据(例如获取用户的个人资料)。
- Update(更新):修改现有数据——要么完全替换,要么只更改某些字段。
- 整体更新替换整个资源。
- 部分更新只更改指定的字段。
- Delete(删除):从系统中移除记录或资源。
| CRUD | 典型方法 | 为什么这样搭配 |
|---|---|---|
| Create | POST | 非幂等;由服务器选择新的 URI |
| Read | GET(或 HEAD) | 安全且可缓存 |
| Update-whole | PUT | 幂等的完整替换 |
| Update-partial | PATCH | 幂等的字段级更改 |
| Delete | DELETE | 幂等的删除 |
4.1 当 CRUD 不适用时
- 登录/登出——POST
/auth/login、POST/auth/logout - 复杂操作——POST
/payments/{id}/capture - 批量操作——POST
/users/bulk_delete,附带一个由 ID 组成的 JSON 数组
5 逐个方法详解
下面的每一节都遵循相同的结构:
语义 • 幂等性 / 安全性 • 典型状态码 • Divooka 示例 • 常见陷阱
5.1 GET
- 安全 + 幂等 + 可缓存
- 状态码 200 OK、304 Not Modified。
- Divooka:拖入一个 Send (HTTP) Request 节点 → Method = GET → URL =
{{base}}/users?active=true→ 连接到 Preview JSON。 - 陷阱:不要在 GET 中修改数据(“这只是一个无害的跟踪像素!”……直到广告拦截器删掉你一半的数据库)。
5.2 POST
- 创建或处理;默认不是幂等的。
- 状态码 201 Created(新的 URI 位于
Location请求头中)或 200 OK。 - Divooka:添加一个 Text 或 (YAML) To JSON 节点,选择 POST
/users,正文为{"name": "Bob"}。 - 陷阱:在缓慢的 Wi-Fi 上重复提交付款表单 → 被扣款两次。请使用 Idempotency-Key 请求头或在后端去重。
5.3 PUT
- 对给定 URI 处的资源进行完整替换。幂等。
- 状态码 200 OK(有正文)、204 No Content(无正文)。
- Divooka:对
/users/123发送 PUT 请求,附带完整的用户对象(JSON 格式)。 - 陷阱:只发送已更改的字段——服务器会把缺失的字段覆盖为 null。
5.4 PATCH
- 部分更新;如果实现合理,则是幂等的。
- 正文可以是“merge patch”(只包含已更改的字段),也可以是 RFC 6902 JSON Patch。
- Divooka:使用 Text 节点编写部分 JSON → 对
/users/123发送 PATCH 请求,正文为{"email": "new@x.com"}。 - 陷阱:客户端和服务器对补丁格式的理解不一致 → 415 Unsupported Media Type。
5.5 DELETE
- 删除资源;幂等。
- 状态码 204 No Content(成功)、404 Not Found(已不存在)。
- Divooka:使用
DELETE的 Send Request 节点 → 把状态码传入 Branch:如果是 204,显示“已删除”,否则记录错误。 - 陷阱:未经身份验证的删除(糟糕!)。
5.6 HEAD
- 类似 GET,但只返回响应头。
- 用于探测资源是否存在或获取元数据(
Content-Length、Last-Modified)。 - Divooka:对
/videos/intro.mp4发送 HEAD 请求 → 如果Content-Length> 10 MB,则改为流式传输缩略图。
5.7 OPTIONS
- “我在这里能做什么?”——返回
Allow响应头和 CORS 规则。 - 对浏览器的预检请求(
Access-Control-Request-Method)至关重要。 - Divooka:对
/users发送 OPTIONS 请求 → 解析Allow,动态启用/禁用按钮。 - 陷阱:服务器忽略 OPTIONS → 跨域 JS 就要哭了。
5.8 较少见的方法(TRACE、CONNECT、自定义方法)
- TRACE——回显请求(用于调试;通常被禁用)。
- CONNECT——隧道(通过代理传输 TLS)。
- 自定义方法——例如 WebDAV 的
PROPFIND、REPORT。Divooka 可以在方法字段中发送任意标记。
6. 状态码及其“伙伴”
| 状态码 | 动词 | 含义 | Divooka 提示 |
|---|---|---|---|
| 200 OK | GET/PUT/PATCH | 成功,有正文 | 在 JSON 查看器中查看 |
| 201 Created | POST | 资源已创建;见 Location |
将响应头提取到变量中 |
| 204 No Content | PUT/PATCH/DELETE | 成功,无正文 | 跳过 JSON 解析 |
| 301/302 | 任意 | 重定向,会改变 GET/POST 规则 | 自动跟随?在节点中切换 |
| 307/308 | 任意 | 重定向,保留方法 | 适用于 PUT → PUT |
| 400 | 任意 | 语法/正文错误 | 显示错误提示 |
| 401/403 | 任意 | 身份验证失败 / 禁止访问 | 刷新令牌逻辑 |
| 404 | 任意 | 未找到 | 重试?可能没用 |
| 405 | 任意 | 方法不被允许 | 你选错了动词 |
| 500/503 | 任意 | 服务器故障 / 过载 | 添加重试/退避循环 |
7 最佳实践与常见陷阱
- 选择正确的动词——代理、缓存、SDK 生成器都依赖于它。
- 设置
Content-Type和Accept——自动检测只是个神话。 - 对有风险的 POST 请求(付款、注册)使用幂等键。
- 处理 CORS——如果浏览器会调用你的服务,就要支持 OPTIONS。
- 礼貌地为 API 做版本管理——通过路径(
/v2/users)或请求头(Accept-Version),不要在半途中给方法赋予额外的含义。 - 保护破坏性的动词——PUT/PATCH/DELETE 要求身份验证。
- 安全地并行化——GET 可以并发执行;而针对同一资源竞争的两个 PUT 应当串行执行或使用 ETag。
8 高级主题(可选,供提前阅读)
- HATEOAS——响应中包含后续可执行的操作(带有方法提示的
_links)。 - 条件请求——使用
If-None-Match、If-Match节省带宽并避免更新丢失。 - HTTP/2 多路复用——一个连接中可以有多个请求;方法保持不变。
- GraphQL 与 REST——所有请求都是 POST,但缓存转而依赖查询哈希。
- Webhook——它们只是反方向的 POST;设计接收方时,请遵循你对客户端所期望的同样的动词规范。
9 融会贯通:端到端示例场景
下面是三个贴近实际的工作流,每个都拆分为清晰的步骤,展示不同的 HTTP 方法如何在单个流程中协同工作。可以把每一步看作 Divooka 中的一个节点:你选择的方法决定了接下来会发生什么。在这些场景之后,我们会简要看看如何把其中一个场景映射为一个简单的可视化管道。
9.1 场景 A:用户注册流程
假设一位新用户正在你的网站上注册。你需要防范跨站攻击、创建账户、确认对方的电子邮件,最后让对方更新个人资料。整个过程如下:
获取 CSRF 令牌(GET /csrf-token)。 首先,客户端发送一个
GET /csrf-token请求。服务器在正文中返回一个令牌(例如{ "csrf_token": "abc123" })。在 Divooka 中,这可能是一个 GET 节点,连接到一个“存储令牌”节点,后者把csrf_token保存到一个变量中。提交注册表单(POST /register)。 接下来,客户端发送一个
POST /register请求,正文为类似下面的 JSON:{ "username": "jane_doe", "email": "jane@example.com", "password": "s3cur3", "csrf_token": "abc123" }如果一切有效,服务器会返回状态码 201(Created),可能还会附带一条“请验证你的电子邮件”的消息。在 Divooka 中,你会使用一个 POST 节点,带上
X-CSRF-Token或将其放入 JSON 中,然后把响应路由到一个“检查状态”节点。如果是 201,就继续;如果是 400,就显示错误。轮询电子邮件验证状态(GET /verify?token=…)。 注册之后,用户点击电子邮件中的链接(类似
/verify?token=xyz)。客户端可以通过反复发送GET /verify?token=xyz来模拟轮询。每次,服务器可能会这样回复:- 在用户点击真正的链接之前,回复
200 OK { "verified": false } - 用户点击之后,回复
200 OK { "verified": true }在 Divooka 中,你可以使用一个循环:由一个 GET 节点检查response.body.verified;如果为false,等待几秒后重试(最多重试一定次数);如果为true,则继续。
- 在用户点击真正的链接之前,回复
更新新用户的个人资料(PATCH /users/)。 账户验证通过后,客户端发送
PATCH /users/123(假设服务器返回了id = 123),正文例如:{ "display_name": "Jane Doe", "avatar_url": "https://..." }这个部分更新让用户可以个性化自己的账户。服务器返回
200 OK以及更新后的用户对象。在 Divooka 中,一个 PATCH 节点读取已存储的id并发送 JSON 补丁。如果成功,就显示“欢迎,Jane!”;如果失败,错误处理程序就会介入。
9.2 场景 B:库存管理
假设你经营一个电子商务网站,需要让仓库数据保持同步。你希望列出所有商品、更新库存数量、删除已售罄的产品,并批量添加新产品。下面是一种直接的做法:
获取当前商品(GET /items)。 客户端发送
GET /items,服务器返回一个 JSON 数组:[ { "id": 101, "name": "Widget A", "quantity": 5 }, { "id": 102, "name": "Widget B", "quantity": 0 }, { "id": 103, "name": "Widget C", "quantity": 12 } ]在 Divooka 中,一个 GET 节点连接到一个“For Each”节点,后者遍历
response.body中的每个商品。在需要时更新数量(PUT /items/)。 对于任何库存发生变化的商品——例如 Widget A 从 5 变为 3——你发送:
PUT /items/101 { "id": 101, "name": "Widget A", "quantity": 3 }在 Divooka 中,每次循环迭代都会检查
quantity是否需要调整;如果需要,就调用一个 PUT 节点,并传入完整的商品对象。成功后,服务器回复200 OK或204 No Content。删除已售罄的商品(DELETE /items/)。 如果
quantity为 0(比如 Widget B),客户端就发送DELETE /items/102。服务器回复204 No Content,表示“商品已删除”。在 Divooka 中,同一个 For Each 循环中可以包含一个条件判断:如果quantity == 0,就调用 DELETE 节点;否则跳过。批量添加新商品(POST /items/bulk)。 最后,要一次添加多个新产品,只需发送一个请求:
POST /items/bulk { "items": [ { "name": "Widget D", "quantity": 20 }, { "name": "Widget E", "quantity": 15 } ] }服务器返回
201 Created以及新 ID 的列表:{ "created": [ { "id": 104 }, { "id": 105 } ] }在 Divooka 中,这只需要一个 POST 节点,再配合一个遍历你的“newItems”列表的 JSON Builder。成功之后,你可以记录一份摘要,或者显示一条“批量添加完成”的消息。
9.3 场景 C:自动化错误处理与重试逻辑
当服务繁忙时,你不希望整个流程崩溃。相反,应当通过重试来处理 503 Service Unavailable,如果仍然失败再发出警报。下面是一个简单的模式:
初始请求(GET /health-check)。 首先发送
GET /health-check。服务器通常返回200 OK { "status": "healthy" }。在 Divooka 中,把响应路由到一个检查statusCode的“Switch”节点。如果遇到 503,暂停后重试。 如果
statusCode == 503,使用一个设置为 5000 毫秒(5 秒)的“Delay”节点,然后循环回到同一个 GET 节点。记录重试次数——尝试 3 次后停止。在 Divooka 中,这可能是一个小的子流程,其中有一个变量retryCount,每次遇到 503 时递增。如果重试后仍然失败,发送警报(POST /alerts)。 当
retryCount达到 3 而你仍然收到 503 时,转到一个POST /alerts节点,正文为:{ "message": "Health check still failing after 3 retries.", "timestamp": "2025-06-02T15:00:00Z" }服务器回复
201 Created。在 Divooka 中,你可以把它连接到一个“Notification”节点,通过电子邮件发送或记录该问题。只要有一次 GET 成功(200),就继续正常流程。 一旦从
GET /health-check收到200 OK,就跳出重试,继续执行其他任务(例如定时数据获取或关键更新)。在 Divooka 中,这只是 Switch 节点针对statusCode == 200的另一个分支。
9.4 示例管道示意图(过程式上下文)
下面粗略展示了场景 B 在 Divooka 中可能的样子。每个方框代表一个节点,箭头表示数据流。每个节点中的方法(GET/PUT/DELETE/POST)决定了你是在获取、更新、删除还是创建数据。
[Start]
↓
[GET /items] ← Fetch list of items
↓
┌───────────────┐
│For Each item │────────────────────────────────────────────────────╮
└───────────────┘ │
↓ │
[Check quantity] │
↓ │
[quantity > 0?] ─ No─▶[DELETE /items/{id}] ──→(Log “Deleted”) │
↓ Yes │
[quantity changed?] ─ No─▶(Skip update) │
↓ Yes │
[PUT /items/{id}] ──→(Log “Updated”) │
↓ │
⤵─────────────────────────────────────────────────────────────────┘
↓
[Collect results]
↓
[POST /items/bulk] ← Add new items
↓
[Show “Done” Message]
↓
[End]
- GET /items 节点获取所有商品。
- 对响应中的每个商品进行循环(
For Each item)。 - 一个 Decision 节点检查是否
quantity == 0。- 如果是,调用 DELETE /items/ 并记录成功。
- 如果不是,检查
quantity是否发生了变化。- 如果有变化,调用 PUT /items/ 进行更新并记录。
- 否则什么也不做,继续下一个。
- 循环结束后,管道收集你想要添加的所有新商品,并以一个批次发送 POST /items/bulk。
- 最后,一个节点显示“Done”或写入日志。
实践要点
- 你可以看到每个 HTTP 方法如何各司其职——只在
quantity == 0时使用DELETE,只在需要更改时使用PUT,只在批量创建时使用POST。 - Divooka 的可视化模型让这些分支和循环变得直观:你只需拖放添加一个判断节点,选择你的变量(比如
quantity),然后连线即可。 - 结合场景 C 中的
Switch、Delay和重试计数器,你可以优雅地处理错误:重试几次,然后发出警报。
把这些示例当作模板来使用。换成你自己的端点,调整请求头,让 Divooka 来完成插入正确的空行、计算 Content-Length、路由成功与失败路径等繁重工作。需要调试时,可以逐步进入程序流程查看中间结果,或者使用底层节点并粘贴确切的 HTTP 文本,观察请求头和正文是如何在网络上传输的。
10 速查参考
| 方法 | 安全 | 幂等 | 成功状态码 | 典型用途 |
|---|---|---|---|---|
| GET | ✔ | ✔ | 200, 304 | 读取数据 |
| HEAD | ✔ | ✔ | 200 | 读取响应头 |
| POST | ✘ | ✘ | 201, 200 | 创建 / 操作 |
| PUT | ✘ | ✔ | 200, 204 | 替换资源 |
| PATCH | ✘ | ✔ | 200, 204 | 部分更新 |
| DELETE | ✘ | ✔ | 204, 200 | 删除资源 |
| OPTIONS | ✔ | ✔ | 200 | 能力探测 / CORS |
11 关键要点
- HTTP 在网络上传输的只是文本——掌握原始格式,你就能调试任何问题。
- 方法的选择会影响缓存、重试、安全,甚至在按请求计费的方案中影响费用。
- Divooka(或任何其他工具)会自动处理请求头、空行和
Content-Length,但了解底层原理能让你从用户变成高手。 - 拿不准时:GET 用于读取,POST 用于创建,PUT/PATCH 用于更新,DELETE 用于删除。 如果你要打破这条规则,请给出有文档记录的理由。
后续步骤
- 启动 Divooka,创建一个名为 “Method Playground” 的新工作区文档
- 重建上面的示例——切换到原始模式,观察传输的字节。
- 试着在 POST 请求中添加一个
Idempotency-Key请求头,然后单击“Run”五次。记下你的服务器做了什么。 - 收藏本文。将来那个盯着一个莫名其妙的 405 发呆的你会感谢你的。
参考资料
- 知识库中关于 REST API 的文章。
- Divooka Web API 测试示例。