4

私の質問はとても簡単です。調べてみても、簡単で満足のいく答えは見つかりませんでした。

サーバーからデータを取得するために Jquery ajax リクエストを使用しています。サーバーは、Etag および Cach-control ヘッダーを に設定する REST API をホストしますGET requests。また、サーバーは CORS ヘッダーを設定して、Etag. API のクライアントはブラウザー Web アプリです。Ajax リクエストを使用して API を呼び出しています。以下は、単純な GET 要求の後のサーバーからの応答ヘッダーです。

Status Code: 200 OK
Access-Control-Allow-Origin: *
Cache-Control: no-transform, max-age=86400
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: application/json
Date: Sun, 30 Aug 2015 13:23:41 GMT
Etag: "-783704964"
Keep-Alive: timeout=15, max=99
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
Vary: Accept-Encoding
access-control-allow-headers: X-Requested-With, Content-Type, Etag,Authorization
access-control-allow-methods: GET, POST, DELETE, PUT

私が知りたいのは:

サーバーから送信されたレスポンス ヘッダーから手動で収集し、ヘッダーを ajax リクエストにEtag添付する必要がありますか?または、「Etag」がある場合if-no-match、ブラウザーはデフォルトでリクエストでそれを送信しますconditional get

  • ブラウザのネットワーク コンソールを介してデバッグを行いましたが、ブラウザがconditional GET自動的に実行しているようで、if-no-matchヘッダーが設定されています。

  • それが正しければ、新しいリソースを作成し、get リクエストを呼び出したとします。過去にキャッシュされたデータが初めて表示されます。しかし、ページをリロードすると、更新されたページが表示されます。サーバー側のデータセットが変更され、別Etagの .

  • ページネーションの場合も。URL があるとします/users?next=0next is a query paramの値は、next新しいリクエストごとに変化します。各応答は独自の「Etag」を取得するためです。ブラウザはリクエストに基づいて「Etag」を保存しますか、それともEtagURL に関係なく、前回の get リクエストの最新のものを保存するだけですか。
4

1 に答える 1

0

さて、私はどういうわけか自分で解決策を見つけました:

if-no-matchurl がe-tag以前の .xml にヘッダーを持っていることを確認すると、ブラウザーはヘッダー自体を送信しますrequest。ブラウザはe-tagその URL に関して を保存するため、異なる URL でのリクエストがいくつ発生しても問題ありません。

また、ブラウザに を強制的に取得させconditional-getて をチェックさせるトリックe-tag:

  • Set the max-age header to the lowest(私にとって60代は素晴らしい作品です)
  • cache期限切れになると、ブラウザは有効conditional-getかどうかを確認するために を送信しexpired cached resourceます。if-no-matchヘッダーがe-tag. 304: Not-Modifiedサーバーはヘッダーを付けて応答を返します。これは、期限切れのキャッシュされたリソースが有効であり、使用できることを意味します。
于 2015-09-14T10:45:04.490 に答える