HTTP 202が受け入れられました(HTTP / 1.1)
HTTP 202 Acceptedステータスを探しています。RFC 2616を参照してください:
要求は処理のために受け入れられましたが、処理は完了していません。
HTTP 102処理(WebDAV)
RFC 2518では、次の使用を推奨していHTTP 102 Processingます。
102(処理中)ステータスコードは、サーバーが完全な要求を受け入れたがまだ完了していないことをクライアントに通知するために使用される暫定応答です。
ただし、警告があります。
サーバーは、要求が完了した後に最終応答を送信する必要があります。
最後の文をどう解釈するかわかりません。サーバーは処理中に何も送信せず、完了後にのみ応答する必要がありますか?または、処理が終了したときにのみ応答を強制的に終了しますか?これは、進行状況を報告する場合に役立ちます。HTTP 102を送信し、バイトごとに(または行ごとに)応答をフラッシュします。
たとえば、長くても線形のプロセスの場合、100文字のドットを送信して、各文字の後にフラッシュできます。クライアント側(JavaScriptアプリケーションなど)が正確に100文字を想定していることを知っている場合、ユーザーに表示する進行状況バーと一致させることができます。
別の例は、いくつかの非線形ステップで構成されるプロセスに関するものです。各ステップの後、最終的にユーザーに表示されるログメッセージをフラッシュして、エンドユーザーがプロセスの進行状況を把握できるようにすることができます。
プログレッシブフラッシュの問題
この手法にはメリットがありますが、お勧めしません。その理由の1つは、接続を強制的に開いたままにすることです。これは、サービスの可用性の点で損害を与える可能性があり、適切に拡張できません。
より良いアプローチは、応答してHTTP 202 Accepted、ユーザーが後であなたに戻って処理が終了したかどうかを判断させることです(たとえば、プロセスまで/process/resultHTTP 404 Not FoundまたはHTTP 409 Conflictで応答するような特定のURIを繰り返し呼び出すことによって)終了し、結果の準備ができました)、またはメッセージキューサービス(例)またはWebSocketsを介して、たとえばクライアントをコールバックできる場合、処理が完了したときにユーザーに通知します。
実用例
ビデオを変換するWebサービスを想像してください。エントリポイントは次のとおりです。
POST /video/convert
HTTPリクエストからビデオファイルを取得し、それを使用して魔法をかけます。魔法はCPUに負荷がかかるため、リクエストの転送中にリアルタイムで実行できないと想像してください。これは、ファイルが転送されると、サーバーがHTTP 202 AcceptedJSONコンテンツで応答することを意味します。将来のどこかで準備が整い、ID 123で利用できるようになります。」
クライアントは、処理の終了時に通知されるメッセージキューにサブスクライブする可能性があります。終了すると、クライアントは次の場所に移動して処理済みのビデオをダウンロードできます。
GET /video/download/123
につながるHTTP 200。
クライアントが通知を受信する前にこのURIを照会するとどうなりますか?HTTP 404実際、ビデオはまだ存在しないため、サーバーは応答します。現在準備中です。リクエストされることはありません。過去のある時点で存在し、後で削除される場合があります。重要なのは、結果のビデオが利用できないことです。
さて、クライアントが最終的なビデオだけでなく、進行状況(メッセージキューサービスや同様のメカニズムがない場合はさらに重要になる)も気にする場合はどうでしょうか?
この場合、別のエンドポイントを使用できます。
GET /video/status/123
これは、次のような応答を返します。
HTTP 200
{
"id": 123,
"status": "queued",
"priority": 2,
"progress-percent": 0,
"submitted-utc-time": "2016-04-19T13:59:22"
}
リクエストを繰り返し行うと、次のようになるまで進行状況が表示されます。
HTTP 200
{
"id": 123,
"status": "done",
"progress-percent": 100,
"submitted-utc-time": "2016-04-19T13:59:22"
}
これらの3種類の要求を区別することが重要です。
POST /video/convertタスクをキューに入れます。一度だけ呼び出す必要があります。もう一度呼び出すと、追加のタスクがキューに入れられます。
GET /video/download/123操作の結果に関するものです。リソースはビデオです。ここでは、処理(要求の前に、要求とは独立して実際の結果を準備するために内部で行われた処理)は無関係です。1回または数回呼び出すことができます。
GET /video/status/123処理自体に関係します。何もキューに入れません。結果のビデオは気にしません。リソースは、処理自体です。1回または数回呼び出すことができます。