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


88

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

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

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

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

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

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

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


2
私は個人的にそれは良いものだと思います、それはまさにの定義です202。彼らはより多く、その場合には、ブラウザ/ユーザーエージェントの相互作用に使用しているとして、いくつかのwebdevelopersが適切なステータスコードを気にするので、それはあまり実際に使用されていないということは、より私見である202(それらを与えるそれらを目に見える手がかりを与えない200よ幸せと彼ら。 ..)。
Wrikken 2010年

1
@ user359996、を使用してください200202何であるはずであることを、実際に人々が期待していません202
Pacerier 2015年

ただし、実際に使用するには200のETAが必要です。
ロブ

回答:


65

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

パブリックインターネットの場合、クライアントの互換性についてはあまりにも心配です。私は非常に多くのif (status == 200)ハードコードされたものを見てきました...その場合、私はを返します200

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

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


15

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

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


+1コメントありがとうございます。ドキュメントについての良い点。しかし、私の質問に対する明確な編集に注意してください(「工場」を探してください)。
user359996 2010年

最初に要求したのと同じURIをポーリングするだけの場合は、応答でそのURIを省略できます。(これがどのように機能するかを文書化するだけです:
nos

良い考えですが、キャッシュが必要なので、POSTはありません。さらに、URIはメソッドではなくリソースを指定します。私はRPCアプローチではなくRESTfulアプローチを採用しています(申し訳ありませんが、別の不特定の制約-私の悪いです)。
user359996 2010年

正確には、「RESTful」とは、実際には「リソース指向」を意味します。これは、技術的には、REST制約で指定されているよりも少し多いものです。
user359996 2010年

12

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

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

それはすべて非常にピューリタンであり、実際にはあまり実践されていないので、202を返すことでおそらく安全です。GETは200を返す必要があります。POSTは終了した場合は200を返し、完了していない場合は202を返すことができます。

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


4
非常に良い考えですが、ここに当てはまるかどうかはわかりません。OPの説明によると、これは適切なGETリクエストのようです(サーバー上で何も変更されないという点で)。計算と入力に時間がかかるだけです。その場合、別のときにフェッチされます。たぶん、OPは権威あるコメントを与えることができます。これはAPI用なので、クリーンなインターフェイスのために「ピューリタン」であるのは問題ありません
Pekka 2010年

ああ、ペッカに触れて。そうです、GETがその方法です。そして、HTTP spcは、準備ができていないGETを実際には考慮していないと思います。だから彼はどちらの方向にも行くことができた
Dlongnecker 2010年

7
(現在は無関係)信頼できるコメント:はい、これはべき等であると考えています。リソースは、どちらもむしろそれの修正もなく、作成されている表現がまだ計算されていません。
user359996 2010年

1
それはどこにありますか?また、200を返す場合、クライアントは表現が返されることを期待する必要がありますが、そうではありません。
user359996 2010年

1
私はそれを取り戻します。202はGETまたはPOSTだけに対応していないようです。プロトコルを見たときの考え方だけで、202はGETリクエストに対してのみ存在することになりました。202はあなたの目的には問題ないはずです。
dlongnecker 2010年

0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.