10

在研究用于异步操作的 RESTful API 时,我遇到了以下设计模式:

POST uri:longOperation返回:

  • HTTP 202
  • 位置:uri:pendingOperation

GET uri:pendingOperation返回:

  • 如果操作正在运行
    • 返回进度报告。
  • 如果操作完成
    • HTTP 303
    • 位置:uri:操作响应

GET uri:operationResponse

  • 异步操作的响应

我发现最后一步有问题。考虑一下如果异步操作完成时出现一个对 没有意义的错误代码HTTP GET,例如HTTP 409 ("Conflict").

  1. 不需要HTTP 303指向与uri:pendingOperation相关的响应,而不是uri:operationResponse
  2. 以这种方式使用是否HTTP 303有害?如果不是,为什么?
  3. 这是我们能做的最好的,还是有更好的方法?
4

1 回答 1

6

HTTP 303 是否需要指向与 uri:pendingOperation 相关的响应,而不是 uri:operationResponse?

规范没有明确说它是必需的,但我倾向于同意你的观点 。

以这种方式使用 HTTP 303 是否有害?如果不是,为什么?

我认为您通过执行 303 会失去功能。虽然完成后自动重定向“很好”,但它使您没有机会提供围绕结果的元数据,这些元数据可用于报告等...还有很多客户端不会自动关注 303,因此客户端可能需要做一些工作来关注 303 Location 标头。

这是我们能做的最好的,还是有更好的方法?

我倾向于建议在GET uri:pendingOperation“完成”时始终使用状态资源返回 200 并引用输出。就像是

不完整时

{
    "status" : "PENDING"
}

错误时

{
    "status" : "COMPLETE"
    "errors" : [
       {
          "typeId" : "OPERATION_TIMEOUT",
          "description" : " "The request was unable to complete because the systems are unresponsive".
       }
    ]
}

成功时

{
    "status" : "COMPLETE"
    "links" : {
       "result" : {
          "href" : "http://api.example.com/finished-resource/1234",
       }
    ]
}

于 2013-02-02T23:27:29.400 回答