97

表現が遅延して作成される一連のリソースがあります。これらの表現を構築するための計算には、サーバーの負荷、特定のリソース、および月の満ち欠けに応じて、数ミリ秒から数時間かかることがあります。

リソースに対して受信した最初の GET 要求によって、サーバーで計算が開始されます。計算が数秒以内に完了すると、計算された表現が返されます。それ以外の場合は、202 "Accepted" ステータス コードが返され、クライアントは最終的な表現が利用可能になるまでリソースをポーリングする必要があります。

この動作の理由は次のとおりです。結果が数秒以内に得られる場合は、できるだけ早く取得する必要があります。それ以外の場合、いつ利用可能になるかは重要ではありません。

メモリが限られていることとリクエストの量が非常に多いため、NIO もロング ポーリングもオプションではありません (つまり、ほぼ十分な数の接続を開いたままにしておくことはできず、すべてのリクエストをメモリに格納することさえできません。一度「数秒」)超過した要求を保持します)。同様に、クライアントの制限により、代わりに完了コールバックを処理できません。最後に、POST 先の「ファクトリー」リソースを作成することに興味がないことに注意してください。余分なラウンドトリップは、必要以上に区分的リアルタイム制約に失敗することを意味するためです (さらに、これは余分な複雑さです。また、これはキャッシュの恩恵を受けます)。

GET リクエストに応答して 202 の "Accepted" ステータス コードを返すことについては、いくつかの論争があると思います。実際に見たことがないので、その最も直感的な使用法は安全でないメソッドへの応答ですが、私は決して特にそれを思いとどまらせる何かを見つけました。さらに、安全性と冪等性の両方を維持していませんか?

では、人々はこのアプローチについてどう思いますか?

編集:これはいわゆるビジネス Web API 用であり、ブラウザー用ではありません。

4

4 に答える 4

71

明確に定義され、文書化された API の場合は、何が起こっているのか 正確202に聞こえます。

公共のインターネット用の場合、クライアントの互換性について心配しすぎます。私は非常に多くのif (status == 200)ハードコードを見てきました....その場合、私は . を返します200

また、RFCは、GET 要求に 202 を使用することが間違っていることを示していませんが、他のコードの説明 (200 など) では明確に区別しています。

リクエストは処理のために受け入れられましたが、処理は完了していません。

于 2010-11-04T18:23:47.023 に答える
21

最近のアプリケーションでこれを行いました。クライアント(ブラウザではなくカスタムアプリケーション)がクエリをPOSTすると、サーバーは投稿された「ジョブ」にURIを含む202を返します。クライアントはそのURIを使用してポーリングします。結果-これは、行われていたことにうまく適合しているようです。

ここで最も重要なことは、とにかくサービス/ APIがどのように機能するか、そして202の応答が何を意味するかを文書化することです。

于 2010-11-04T18:31:01.977 に答える
12

私が思い出せることから、GETはサーバーを変更せずにリソースを返すことになっています。アクティビティがログに記録されるか、何かが発生する可能性がありますが、リクエストは同じ結果で再実行できるはずです。

一方、POST は、サーバー上の何かの状態を変更する要求です。レコードの挿入、レコードの削除、ジョブの実行など。202 は、返されたが終了していない POST に適していますが、実際には GET 要求ではありません。

GET は 200 を返す必要があります。POST は、完了した場合は 200 を返し、完了していない場合は 202 を返すことができます。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

于 2010-11-04T18:41:05.673 に答える