web-dev-qa-db-ja.com

HTTP GETに応答して202「Accepted」を返すのは間違っていますか?

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

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

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

メモリが限られているため、リクエストの量が多いため、NIOもロングポーリングもオプションではありません(ieすべてのリクエストをメモリに収めることさえできます;「数秒」が経過したら、余分なリクエストを保持します。同様に、クライアントの制限により、代わりに完了コールバックを処理できません。最後に、追加のラウンドトリップは、必要以上にピース単位のリアルタイム制約に失敗することを意味するため、1つのPOSTを行う「ファクトリー」リソースの作成には興味がないことに注意してください(さらに、これは余分な複雑さです。また、これはキャッシングの恩恵を受けます)。

GETリクエストへの応答で202 "Accepted"ステータスコードを返すことに関して、実際には見たことがないように議論があり、最も直感的な使用は安全でないメソッドへの応答であると思いますが、特に落胆させるものを見つけました。さらに、安全性とべき等性の両方を維持していませんか?

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

[〜#〜] edit [〜#〜]:これは、いわゆるビジネスWeb API向けであり、ブラウザ向けではないことに注意してください。

76
user359996

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

公共のインターネット向けの場合、クライアントの互換性についてあまりにも心配です。たくさんのif (status == 200)がハードコードされているのを見てきました。その場合、_200_を返します。

また、 [〜#〜] rfc [〜#〜] は、GETリクエストに202を使用するのが間違っていることを示すものではありませんが、他のコード記述(たとえば200)で明確に区別します。

要求は処理のために受け入れられましたが、処理は完了していません。

60
Pekka 웃

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

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

11
nos

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

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

それはすべて非常に純粋であり、野生ではよく練習されていないので、おそらく202を返すことで安全です。GETは200を返す必要があります。POST.

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

9
Dlongnecker

IDによって明確に指定されたエンティティの表現を持つことになっているリソースの場合(質問で説明されている「工場」リソースとは対照的に)、GETメソッドを使用することをお勧めします。遅延作成またはその他の一時的な状況のためにエンティティ/表現が利用できない場合は、より適切で実際にこのような状況向けに設計された503 Service Unavailable応答コードを使用します。

この理由は、HTTP自体のRFC(503応答コードの説明を確認してください)、および他の多くのリソースに記載されています。

一時的に利用できないページのHTTPステータスコード と比較してください。その質問は別のユースケースに関するものですが、実際にはHTTPのまったく同じ機能に関連しています。

0
Hermes