2013-02-12 9 views
17

サーバーが非同期要求のステータスコード202 - Acceptedを返すときに、要求完了の見積もりを行う適切な方法は何ですか? HTTP spec(私によって追加イタリック体)からHTTPステータス202 - 非同期リクエストの完了に関する情報を提供する方法?

202受理

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

エンティティは、ステータスモニタ又はユーザが要求を満たすことが期待できる場合のいくつかの見積りに対するリクエストの現在のステータスの表示とポインタのいずれかを含むべきである。この応答で返されます。ここで

思考のいくつかされています

  • 私はmax-ageディレクティブをちらっと見てきたが、それを使用してCache-Controlを濫用することでしょうか?
  • 応答本体の予想待ち時間を返しますか?
  • アプリケーション固有のX-レスポンスヘッダーを追加しましたが、X-ヘッダーは、RFC 6648で廃止されましたか?
  • X-以外の)特定の応答ヘッダーを追加しますか?もしそうなら、どのようにそれを命名すべきですか? SOの質問Custom HTTP headers : naming conventionsはいくつかのアイデアを提供しましたが、非推奨の後では、HTTPヘッダがどのようにフォーマットされ、どのようにそれらの名前を付けられるべきかについてのみ回答します。
  • その他のおすすめ?

答えて

5

具体的には202 - Acceptedの応答コードについて明示的に言及していませんが、Retry-Afterヘッダーが適切なオプションのようです。 documentationから:

Retry-Afterレスポンスヘッダーフィールドは使用できます[...]をクリックして、要求しているクライアントがサービスを利用できなくなると予想される期間を示します。

+1

値が"秒数の整数小数点以下の桁数)」を使用している場合、より良い解像度が必要な場合は、例えばXの値を持つ 'X-Retry-After'ヘッダ代わりにミリ秒が適切でしょうか? –

+0

@JosipRodinカスタムヘッダーを作成するのではなく、 'Retry-After:0'を使うことをお勧めします。なぜなら、クライアントが何ミリ秒も過ぎた応答を得てすぐに再試行できるからです。非同期操作の場合、 'Retry-After:0'は「結果はまだ用意されていませんが、いつでも自由に質問できます」と思われます。 – Gili

+0

@ギリしかし、私は彼らが望むときにいつでも彼らに質問したくない場合はどうしますか?たとえば、大量のクライアントが150ms離れている場合、1秒あたり6リクエストであり、毎秒2リクエストしか持たないという考えがあります。 –

8

これには既存のHTTPヘッダーを悪用しないでください。それはあなた自身のサーバーなので、レスポンスの外観を定義することになります。あなたは、この情報の意図された受取人に対してどのような応答が最も効果的であるかを選ぶことができます(そして、すべきです)。

例えば、人間が判読可能なメッセージを表示することだけに興味がある場合は、text/plain「次の30分以内にリクエストが処理される可能性があります」と返すことができます。スペクトルの他の終わりに

、あなたはおそらく、この(私は完全にその場でこれを作った)のようにフォーマットされ、すべてのRESTの道を行くとapplication/jsonを返すようにしたいかもしれません:

あなたが使用することができます
{ 
    "status": "pending", 
    "completion": { 
    "estimate": "Thu Sep 08 2011 12:00:00 GMT-0400", 
    "rejected-after": "Fri Sep 09 2011 12:00:00 GMT-0400", 
    }, 
    "tracking": { 
    "url": "http://server/status?id=myUniqueId" 
    } 
} 
9

Locationヘッダーを使用して、ステータスモニタのURLを指定します。現在のステータスや見積もりなどのカスタムヘッダー(自分のソフトウェアは誰も使用しません)やレスポンスボディ(Webブラウザがユーザーに少なくとも表示するもの)に入れることができます。

+0

ありがとう、私は 'Location'ヘッダーを忘れていました。おそらく、カスタムレスポンスボディを使用します。 – matsev

+0

実際には、PHPでHTTP 202で 'Location'ヘッダを使用することはできません。なぜなら、RFC 2616の特別なセマンティクスを適用しているからです。 http://php.net/manual/en/function.header.php "2番目の特別なケースは" Location: "ヘッダーです。このヘッダーをブラウザーに送り返すだけでなく、REDIRECT(302 )ステータスコードがブラウザに既に201または3xxステータスコードが設定されていない限り。 –

+0

@JosipRodin RFC 2616は、202(または他の応答)で 'Location'が使用されることを制限しませんが、201/3xxの場合に' Location'が何を参照するかを定義するだけです。つまり、PHPセマンティクス(または、あなたがそれをどのように見ているかに応じてバグ)であり、HTTPセマンティックではありません。 –

関連する問題