飞雪团队

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3720|回复: 0

异步 API 的设计

[复制链接]

5344

主题

5432

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
18354
发表于 2022-2-12 10:44:45 | 显示全部楼层 |阅读模式
网站的前后端通信,往往会有异步请求,这时应该怎么设计 API?
                                                                                                                我最近读到一篇文章,作者介绍了他的做法,设计得很精细,我觉得值得借鉴,可以当作异步 API 的标准设计。

一、同步 API

为了便于比较,先看看同步 API 的设计。下面是一个很简单的例子。
客户端发出一个请求,要求创建资源。
POST https://api.service.io/starsname='Death Star'
服务器回应 201。
HTTP/1.1 201 CreatedLocation: /stars/12345
201 Created告诉客户端,请求成功,资源已经创建。新的资源的网址请看Location字段。
二、异步请求

如果服务器不能立即返回结果,就形成了异步操作。
客户端的请求还是一样的。
POST https://api.service.io/starsname='Death Star'
服务器回应 202。
HTTP/1.1 202 AcceptedLocation: /queue/12345
202 Accepted告诉客户端,请求已经接受,但还没有处理,可以去Location字段查询进展。
除了上面的头信息,服务器的回应如果有数据体,可以返回一些有效信息(比如任务完成的估计时间、当前状态等等)。
三、查询进展

过了一段时间,客户端就发出请求,查询异步处理的进展。
GET https://api.service.io/queue/12345
服务器回应 200。
HTTP/1.1 200 Ok   PENDING  2 mins.   
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,表示该链接永久性不再可用。
(完)
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|飞雪团队

GMT+8, 2024-11-24 00:42 , Processed in 0.059762 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表