我正在设计一个RESTful API,涉及客户提交创建资源的请求,让我们说一个报告。由于有正当理由不值得进入,此过程可能需要至少30秒,最多几分钟才能成功完成。我正在尝试确保此API易于使用且直观易用,因此我只想获得一些关于我正在考虑的事情的反馈。
POST
s向/reports
请求机构202 Accepted
和Location: /jobs/{jobId}
标头进行响应GET
s /jobs/{jobId}
并接收200 OK
和响应体如{"status": "pending"}
(缩写)200 OK
(未更改)和类似的身体
{
"status": "complete",
"location": "/reports/{reportId}",
details": { ... }}
}
GET
s /reports/{reportId}
检索他们的报告我认为有些事情与上述不同:
/jobs/{jobId}
资源返回303 See Other
与Location: /reports/{reportId}
标头准备好了。我看到的一些博客帖子和SO答案采用了这种方法。我决定反对它,因为我们希望将这些工作保留为一流的资源,例如:我们希望能够查看过去24小时内提交的所有工作,过去15分钟内所有失败的工作,等等。此外,似乎303 See Other
真的不应该返回一个机构,因为客户应该被重定向到Location
网址,所以他们无论如何都不会看到它。POST
到/jobs
而不是/reports
。我觉得这两种选择都是可辩护的,但对于客户来说,如果他们想要创造一个report
他们应该POST
到/reports
似乎不那么令人惊讶。话虽这么说,得到一个回应指向他们job
而不是report
可能会令人惊讶。POST
到/reports
还是/jobs
,因为我立刻创建了job
,也许我应该返回201 Created
而不是202 Accepted
。无论如何,这就是我目前对此的想法。任何确认,建议,尊重解释分歧等都非常感谢。
谢谢。
我们希望将这些工作保留为一流的资源,例如:我们希望能够查看过去24小时内提交的所有工作,过去15分钟内所有失败的工作,等等。
如果工作和报告都是一流的,那么我建议给每个人提供通常明显的,无聊的语义:
POST /jobs
返回201 Created
和Location: /jobs/{id}
头球。毕竟,工作立即创建(报告是N / A)。
或者你可以让它返回一个ETag
标题(见下)。GET /jobs/{id}
返回200 OK
;响应主体指示报告的准备情况和(如果准备好)/reports/{id}
的URI。
您可以选择通过返回If-None-Match
来处理304 Not Modified
,直到准备就绪发生变化。当然还有一个ETag
标题。GET /reports/{id}
的作品。附:如果我没有弄错的话,Location
标题应该是完整的URI,例如https://example.com/path/to/thing
不仅仅是相对路径/path/to/thing
。如果你这样做,可能同样对任何JSON响应location
值?这样,客户端可以在发出请求时按原样使用这些值 - 这对他们来说更方便,如果他们不对协议/主机进行硬编码,则会更好。