10

非同期操作用のRESTfulAPIを調査しているときに、次のデザインパターンに遭遇しました。

POST uri:longOperation戻り値:

  • HTTP 202
  • 場所:uri:pendingOperation

GET uri:pendingOperation戻り値:

  • 操作が実行されている場合
    • 進捗レポートを返します。
  • 操作が完了した場合
    • HTTP 303
    • 場所:uri:operationResponse

GET uri:operationResponse

  • 非同期操作の応答

最後のステップは疑わしいと思います。HTTP GET非同期操作が、などの意味をなさないエラーコードで完了した場合にどうなるかを考えてみてくださいHTTP 409 ("Conflict")

  1. uri: operationResponseではなくuri:pendingOperationHTTP 303に関連付けられた応答を指す必要はありませんか?
  2. このように使用HTTP 303することは有害であると見なされますか?そうでない場合、なぜですか?
  3. これが私たちにできる最善のことですか、それとももっと良い方法がありますか?
4

1 に答える 1

6

HTTP 303は、uri:operationResponseではなくuri:pendingOperationに関連付けられた応答を指す必要はありませんか?

仕様には必須とは明記されていませんが、私はあなたに同意する傾向があります。

このようにHTTP303を使用することは、有害であると見なされますか?そうでない場合、なぜですか?

303を実行すると、機能が失われると思います。実行時に自動リダイレクトするのは「良い」ですが、結果に関するメタデータを提供する機会がないため、レポートなどに活用できます。 ...また、多くのクライアントは303を自動フォローしないため、クライアントはとにかく303Locationヘッダーをフォローするための作業を行う必要がある場合があります。

これが私たちにできる最善のことですか、それとももっと良い方法がありますか?

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 に答える