使用不完整的资源响应 REST API 中的异步请求

Responding with an incomplete resource to a async request in a REST API

在异步 REST API 中创建资源,如果我的服务器响应 不完整的资源 并带有状态指示器而不是返回 [=20],这是否有效=]?


举个例子,假设我有一项服务,可以对将消息添加到区块链中的消息进行公证,以便稍后证明它们的存在(如 "Proof of Existence")。

执行需要一段时间,因此最好采用异步方式。

用户发送了一个POST /messages,负载为:

{
    "message" : "Hello SO friends!"
}

然后服务器用 body:

响应 202 Accepted
{
    "id" : 1999283,
    "message" : "Hello SO friends!",
    "status" : "pending",
    "block" : null,
    "timestamp" : null
}

还有一个headerLocation: /messages/1999283

上面描述的资源是不完整,因为它仍然没有块和时间戳,并且具有"pending"状态。

用户将轮询 /messages/1999283 并在服务器等待添加时将在 body 中获得与上面相同 json 的 200 OK到一个街区。

几分钟后,用户将再次轮询并获得 200 OK 以及 complete 资源:

{
    "id" : 1999283,
    "message" : "Hello SO Friends!",
    "status" : "completed",
    "block" : 10029,
    "timestamp" : "20181215T204012Z"
}

据我所知,您所遵循的方法是正确的。 202 Accepted 状态的核心目的是 'Request is accepted and the server will process it'.

现在我在这里看到的唯一问题是直到什么时候?为了回答这个问题,我建议您可以添加一些计算来检查处理类似请求并在第一个响应中发送它们所需的平均时间。

{
    "id" : 1999283,
    "message" : "Hello SO friends!",
    "status" : "pending",
    "block" : null,
    "timestamp" : null,
    "estimatedTime" : 30 ////
}

这将有两个好处:

1) 用户将知道处理请求需要多少时间,并且不会花那么多时间轮询,从而节省服务器上的点击次数。

2) 您可以跟踪重复失败,例如,如果同一个请求多次失败,那么您可以根据业务需求提高该请求的优先级。

除此之外,其他流程看起来很整洁。

另一种看待这个问题的方法是,它可能不是临时资源。可能是状态不完整的常规资源。

如果您认为它是稍后会更改状态的真实资源,则不必考虑使用 202 Accepted。您正在创建的交易 'exists',只是尚未处理。