Rest 为长时间运行的创建过程推荐的工作流
我正在设计一个RESTful API,它涉及客户端提交请求来创建一个资源,比如一个报告。出于不值得深入探讨的正当原因,此过程可能需要至少30秒,最多几分钟才能成功完成。我正在努力确保这个API是容易和直观的工作,所以我只想得到一些反馈,我想做什么Rest 为长时间运行的创建过程推荐的工作流,rest,api-design,Rest,Api Design,我正在设计一个RESTful API,它涉及客户端提交请求来创建一个资源,比如一个报告。出于不值得深入探讨的正当原因,此过程可能需要至少30秒,最多几分钟才能成功完成。我正在努力确保这个API是容易和直观的工作,所以我只想得到一些反馈,我想做什么 客户POSTs请求主体到/reports 服务器用202接受和Location:/jobs/{jobId}头进行响应 客户端GETs/jobs/{jobId}并接收200ok和响应体,如{“status”:“pending”}(缩写) 客户端重试,直到
POST
s请求主体到/reports
202接受
和Location:/jobs/{jobId}
头进行响应GET
s/jobs/{jobId}
并接收200ok
和响应体,如{“status”:“pending”}
(缩写)200 OK
(未更改)和类似{
“状态”:“完成”,
“位置”:“/reports/{reportId}”,
详细信息“{…}”
}
GET
s/reports/{reportId}
检索其报告/jobs/{jobId}
资源返回303请参阅其他位置:/reports/{reportId}
准备就绪时标题。我看到的许多博客帖子和答案都采用了这种方法。我决定不使用这种方法,因为我们希望保留这些作业作为一流资源,例如,我们希望能够查看过去24小时内提交的所有作业,过去15分钟内失败的所有作业,等等。此外,303查看其他
似乎真的不应该这样做返回一个主体,因为客户端应该重定向到位置
url,这样他们无论如何都不会看到它
POST
到/jobs
而不是/reports
。我觉得这两种选择都是有道理的,但对于客户来说,如果他们想创建报告
他们应该POST
到/reports
,这似乎就不那么令人惊讶了。也就是说,得到一个指向他们o用作业
代替报告
POST
到/reports
还是/jobs
,由于我正在立即创建作业
,也许我应该返回201 Created
,而不是202 Accepted
返回POST/jobs
和201 Created
头。毕竟,作业是立即创建的(报告为N/a)Location:/jobs/{id}
- 您也可以选择将此返回设置为
标题(参见下一步)ETag
- 您也可以选择将此返回设置为
返回GET/jobs/{id}
;响应主体指示报告的就绪状态以及(如果就绪)到200ok
的URI/reports/{id}
- 如果没有匹配的话,您可以选择返回
,直到就绪状态发生变化。当然,还可以返回304 Not Modified
头,从而使该句柄ETag
- 如果没有匹配的话,您可以选择返回
- 当然,
是有效的GET/reports/{id}
p、 如果我没弄错的话,
Location
头应该是完整的URI,例如https://example.com/path/to/thing
不仅仅是相对路径/path/to/thing
。如果这样做,可能会对任何JSON响应location
值执行类似操作?这样,客户端可以在发出请求时按原样使用这些值--w这对他们来说更方便,如果他们不硬编码协议/主机,对您来说也更好。我的第一个想法是利用Webhook或允许客户端传递回调url。此外,您是否考虑过允许客户端轮询报告/{reportid}/jobstatus?对我来说似乎更符合逻辑。@robertdraaisma/reports/{reportId}/jobstatus
是一个有趣的想法,但是如果/reports/{reportId}
尚未创建。我考虑过立即同步创建一个框架报表
对象,该对象在报表准备好后立即填充,但我不希望客户端必须处理集合中两种不同的报表
对象。关于:Webhooks/callback URL,我们仍然需要类似/jo的东西bs
collection for monitoring&batch clients,无法使用这种推送方法。谢谢Greg。我认为你是对的。事实上,请求主体不是要持久化并添加到报告集合的报告表示形式,它包含系统需要执行大量计算以生成报告的数据,但是报告看起来一点也不像请求。因此,从工作的角度考虑更有意义,而报告是创建此工作的副作用。非常感谢!是的,我在上面很简短/草率,但将使用绝对URI作为位置。304/ETag有意义,但为了简单和优先级,我们可能会在后面添加。再次感谢!