2011-10-24 2 views
0

シナリオは次のとおりです。リモートCシステムに格納されたエンティティのキ​​ャッシュとして機能するRESTful Webサービスを実装しています。 Webサービスの要件の1つは、リモートのCシステムがオフラインのときに、最後にキャッシュされたデータでGET要求に応答するが、「失効」とフラグを立てることです。失効したデータを返す可能性のあるGETリクエストに使用するHTTPステータスコードは何ですか?

データが無効であるとフラグを立てる方法は、200(OK)以外のHTTPステータスコードを返すことでした。私は503(サービスは利用できません)を使用することを検討しましたが、C#/ Java HTTPクライアントが例外をスローすることがあり、間接的にユーザーに制御フローの例外を使用させてしまうと考えています。

もっと適切なステータスコードを提案できますか?それともレスポンスボディにstalenessフラグを追加するだけですか?もう1つの選択肢は、接続状態を知らせる別個のリソースを定義し、クライアントがそれを個別に処理させることです。

答えて

1

彼は、特定の状況下で

を言う - それは ネットワークから切断されますと、例えば - キャッシュが でオリジンサーバを確認せずに古くなったレスポンスを提供することができます。

あなたのウェブサービスは、仲介キャッシュのように動作しています。

ExpiresまたはMax-ageヘッダーのいずれかが過ぎると、表現が失効します。したがって、

Cache-control: Max-age=0 

で表現を返した場合、返す表現がすでに古くなっていると効果的に言います。

Cache-control: Max-age=3600 

、あなたがデータは、時間のいくつかの非ゼロの量のための新鮮な考えることができる「システムC」から表現を取得するとき、あなたのWebサービスが何かのように表現を返すことができると仮定すると、クライアントはキャッシュをチェックすることができますmax-age == 0のヘッダーを制御して、最初に検索されたときの表現が古くなったかどうかを判断します。

+0

すべての回答は有効ですが、これは私の問題と最も意味的に関連していると考えられています。ありがとう! – PaoloVictor

4

Last-Modifiedヘッダーを適切に設定して、クライアントが古くなったかどうかを判断させるだけです。失効したデータの最終変更日付は、「通常」よりも後ろになります。新しいデータの場合は、Last-Modifiedヘッダーを最新の状態に保ちます。マーク・ノッティンガムのcaching article

2

あなたが古くなったレスポンスを提供している場合は、RFC-2616言う:

保存された応答は、慎重に検討の状況では、クライアントと オリジンサーバの両方の最も 制限鮮度要件によって「十分に新鮮」でない場合キャッシュ は、 ヘッダ(セクション13.1.5および14.46を参照)を使用して応答を返すこともできます(「ノーストア」キャッシュディレクティブまたは " no-cache "cache-request-directive;セクション14.9を参照)。

言い換えれば、200OKを提供することはまったく問題ありません。

2

200 OKと適切なアプリケーション固有の応答が返されます。応答を使用するかどうか、およびその使用方法がクライアントに渡されているため、他のHTTPステータスコードは適切ではありません。私はまた、この目的のために標準的なHTTPキャッシュコントロールヘッダーを使用しないことをお勧めします。私はそれらを第三者(仲介者およびクライアント)キャッシュを制御するためにのみ使用します。これらのヘッダーを使用してアプリケーション固有の情報を伝達すると、アプリケーション・ロジックがキャッシュ・コントロールに無関係に関連付けられます。ただちに明らかになるわけではありませんが、アプリケーションロジックとキャッシング戦略を独自に展開する能力には、長期的なメリットがあります。

関連する問題