3

私はRESTサービスを実装し、クライアントとしてWebページを使用しています。私のページには、RESTサーバーへの同じhttp getリクエストを数回実行し、応答を処理するjavascript関数がいくつかあります。

私の問題は、ブラウザが最初の応答をキャッシュし、実際には次の要求を送信しないことです。

ブラウザにキャッシュせずにすべてのリクエストを強制的に実行させる方法はありますか?InternetExplorer8.0を使用しています

ありがとう

4

3 に答える 3

8

役立つかどうかはわかりませんが、キャッシュされないように、リクエストのURLにランダムなパラメータを追加することがあります。

したがって、次の代わりに:

http://my-server:8080/myApp/foo?bar=baz

私が使用します:

http://my-server:8080/myApp/foo?bar=baz&random=123456789

もちろん、の値はrandomリクエストごとに異なります。そのために現在の時刻をミリ秒単位で使用できます。

于 2010-10-15T12:39:03.773 に答える
7

あまり。これはIEの既知の問題であり、従来の解決策は、すべてのリクエストのクエリ文字列の最後にランダムなパラメーターを追加することです。ほとんどのJSライブラリは、要求した場合にネイティブにこれを実行します(cache:falseたとえば、jQueryのAJAXオプション)

于 2010-10-15T12:38:58.500 に答える
2

もちろん、ブラウザのキャッシュを完全に無効にする必要はありません。正しいキャッシングは REST の重要な部分であり、(クライアントとサーバーの両方が適切に実行されれば) 高度なキャッシングを可能にすると同時に、キャッシュの有効期限と再検証を細かく制御できるという事実は、重要な利点の 1 つです。

あなたが見つけたように、同じドキュメントから同じ URI への後続の GET には問題があります (DOM ドキュメントの有効期間のように、ページをリロードすると、その XMLHttpRequest 要求で別の処理が行われます)。ほとんどの IE は、Web ページ内の同じ画像またはその他の関連リソースの複数のコピーを要求する場合と同様に処理しているようです。エンティティがキャッシュ可能でない場合でも、キャッシュされたバージョンが使用されます。

Firefox には逆の問題があり、情報をキャッシュしてはならないことが示されている場合でも、後続のリクエストを送信します。

各リクエストのクエリ文字列の最後に、ランダムまたはタイムスタンプ付きの偽のパラメーターを追加できます。ただし、これは「THIS IS SPARTA!」と叫んでいるようなものです。そして、苦労して獲得したダウンロードを、健康と安全の検査官が安全レールを配置することを考えていなかった深い穴に蹴り込みました。必要のないときに、完全な無条件のリクエストを繰り返したくないのは明らかです。

ただし、この動作には時間要素があります。後続のリクエストを 1 秒遅らせると、IE は必要に応じて再リクエストを行いますが、Firefox は max-age ヘッダーと expires ヘッダーを尊重し、不要な場合は再リクエストしません。

したがって、2 つのリクエストが 1 秒以内に発生する可能性がある場合 (同じ関数から呼び出されていることがわかっている場合、または 2 つのイベントが連続してトリガーされる可能性がある場合) 、最初のリクエストの 1 秒後にsetTimeout2 番目のリクエストを遅らせるために使用します。has completedは、2 つの異なる種類の不正な動作ではなく、キャッシュを正しく使用するようにします。

もちろん、一秒遅れは一秒遅れです。主にダウンロードされたエンティティのサイズに応じて、これは大したことではない可能性があります。

もう 1 つの可能性は、非常に急速に変化するものを、リソースの状態を GET するものとしてモデル化するのではなく、リソースへの現在のステータスの要求を POST するものとしてモデル化するべきであるということです。これは、REST を悪用し、実際には GET であるべきものを POST することのにおいがします。

つまり、クエリ文字列にランダムなものを追加するという THIS IS SPARTA アプローチが適切であることを意味します。それは本当に依存します。

于 2010-10-15T13:53:08.470 に答える