慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

阮一峰的网络日志

科技爱好者周刊(第 396 期):互联网通信的替代方案 科技爱好者周刊(第 396 期):互联网通信的替代方案 - 阮一峰的网络日志 科技爱好者周刊(第 395 期):软件开发的第三种方式 科技爱好者周刊(第 395 期):软件开发的第三种方式 - 阮一峰的网络日志 科技爱好者周刊(第 393 期):脑腐状态 科技爱好者周刊(第 392 期):axios 投毒与好莱坞式骗术 科技爱好者周刊(第 391 期):AI 的贫富分化 科技爱好者周刊(第 390 期):没有语料,大模型就是智障 套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的"套壳"疑云 科技爱好者周刊(第 389 期):未来如何招聘程序员 科技爱好者周刊(第 388 期):测试是新的护城河 零安装的"云养虾":ArkClaw 使用指南 科技爱好者周刊(第 387 期):你是领先的 科技爱好者周刊(第 386 期):当外卖员接入 AI 字节全家桶 Seed 2.0 + TRAE 玩转 Skill 科技爱好者周刊(第 385 期):马斯克害怕中国车企吗? 智谱旗舰 GLM-5 实测:对比 Opus 4.6 和 GPT-5.3-Codex 科技爱好者周刊(第 384 期):为什么软件股下跌 科技爱好者周刊(第 383 期):你是第几级 AI 编程 Kimi 的一体化,Manus 的分层 科技爱好者周刊(第 382 期):独立软件的黄昏 AI native Workspace 也许是智能体的下一阶段 科技爱好者周刊(第 381 期):中国 AI 大模型领导者在想什么 科技爱好者周刊(第 380 期):为什么人们拥抱"不对称收益" 科技爱好者周刊(第 379 期):《硅谷钢铁侠》摘录 我如何用 AI 处理历史遗留代码:MiniMax M2.1 升级体验 科技爱好者周刊(第 378 期):预测是新的互联网热点 科技爱好者周刊(第 377 期):14万美元的贫困线 科技爱好者周刊(第 376 期):太空数据中心的争议 科技爱好者周刊(第 375 期):一扇门的 Bug 终于有人做了 Subagent,TRAE 国内版 SOLO 模式来了 科技爱好者周刊(第 374 期):6GHz 的问题 VS Code 使用国产大模型 MiniMax M2 教程 科技爱好者周刊(第 373 期):数据模型是新产品的核心 国产大模型接入 Claude Code 教程:以 Doubao-Seed-Code 为例 科技爱好者周刊(第 372 期):软件界面如何设计 大模型比拼:MiniMax M2 vs GLM 4.6 vs Claude Sonnet 4.5 科技爱好者周刊(第 371 期):一个乐观主义者的专访 科技爱好者周刊(第 370 期):正确的代码高亮 错误处理:异常好于状态码 科技爱好者周刊(第 369 期):Tim 与罗永浩的对谈 科技爱好者周刊(第 368 期):不要这样管理软件团队 一天之内,智谱和 Anthropic 都发了最强编程模型 科技爱好者周刊(第 367 期):Nano Banana 的几个妙用 科技爱好者周刊(第 366 期):旧金山疯狂的 AI 广告 科技爱好者周刊(第 365 期):流量变现正在崩塌 科技爱好者周刊(第 364 期):最难还原的魔方 科技爱好者周刊(第 363 期):最好懂的神经网络解释 科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计 科技爱好者周刊(第 361 期):暗网 Tor 安全吗?
異步 API 的設計
阮一峰 · 2018-12-12 · via 阮一峰的网络日志

網站的前後端通信,往往會有異步請求,這時應該怎麼設計 API?

我最近讀到一篇文章,作者介紹了他的做法,設計得很精細,我覺得值得借鑑,可以當作異步 API 的標準設計。

一、同步 API

為了便於比較,先看看同步 API 的設計。下面是一個很簡單的例子。

客戶端發出一個請求,要求創建資源。


POST https://api.service.io/stars

name='Death Star' 

服務器回應 201。


HTTP/1.1 201 Created
Location: /stars/12345

201 Created告訴客戶端,請求成功,資源已經創建。新的資源的網址請看Location字段。

二、異步請求

如果服務器不能立即返回結果,就形成了異步操作。

客戶端的請求還是一樣的。


POST https://api.service.io/stars

name='Death Star' 

服務器回應 202。


HTTP/1.1 202 Accepted
Location: /queue/12345

202 Accepted告訴客戶端,請求已經接受,但還沒有處理,可以去Location字段查詢進展。

除了上面的頭信息,服務器的回應如果有數據體,可以返回一些有效信息(比如任務完成的估計時間、當前狀態等等)。

三、查詢進展

過了一段時間,客戶端就發出請求,查詢異步處理的進展。


GET https://api.service.io/queue/12345 

服務器回應 200。


HTTP/1.1 200 Ok  

<response>
 <status>PENDING</status>
  <eta>2 mins.</eta>
  <link rel="cancel" method="delete" href="/queue/12345" /> 
</response>

200 Ok告訴客戶端,請求成功,具體情況查看數據體。數據體裡給出提示,異步操作已成功或還需要等待。

四、異步操作成功

有一種特殊情況,用戶查詢異步操作的進展的時候,可能會希望,如果異步操作已經完成,就直接跳轉到新資源。

這時,服務器回應 303。


HTTP/1.1 303 See Other 
Location: /stars/97865

303 see other告訴客戶端,重定向到不同的資源。Location字段就是跳轉的目標,也就是新資源的網址。

五、刪除查詢鏈接

一旦異步操作完成,客戶端可以要求服務器刪除查詢鏈接。


DELETE https://api.service.io/queue/12345 

服務器回應 204。


HTTP/1.1 204 No Content

204 No Content告訴客戶端,刪除成功。以後,客戶端再訪問這個查詢鏈接,服務器回應404 Not Found

如果客戶端不刪除查詢鏈接,服務器完成異步任務後,也可以自動刪除。客戶端再請求這個鏈接,服務器回應410 Gone,表示該鏈接永久性不再可用。

(完)