問題タブ [if-none-match]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
http - 「if-none-match」リクエストはいつ送信されますか?
if-none-match
ウェブサイトのキャッシング動作を最適化しているときに、サイトに大量のリクエストが送信されていることに気付きました。私がキャッシュを理解している限り、キャッシュがまだ有効である限り、これは当てはまりません。
1 つの特定のリクエストで、次のものが生成されますresponse-header
。
ご覧のとおり、キャッシュは 300 日間有効です。私が理解している方法では、ブラウザはその期間中にキャッシュを直接使用する必要があります。この期間が終了した後でのみ、ヘッダー付きのリクエストを発行する必要がありif-none-match
ます。しかし、ブラウザはそれを無視してif-none-match
、ページが読み込まれるたびにこの -request を送信して、304-response ("Not Modified")
.
ブラウザがこれらの無用なリクエストを送信しないようにするには、何を変更する必要がありますか?
ajax - サーバーがEtagを送信する場合、if-no-matchをajaxリクエストでプログラムで設定する必要がありますか
私の質問はとても簡単です。調べてみても、簡単で満足のいく答えは見つかりませんでした。
サーバーからデータを取得するために Jquery ajax リクエストを使用しています。サーバーは、Etag および Cach-control ヘッダーを に設定する REST API をホストします
GET requests
。また、サーバーは CORS ヘッダーを設定して、Etag
. API のクライアントはブラウザー Web アプリです。Ajax リクエストを使用して API を呼び出しています。以下は、単純な GET 要求の後のサーバーからの応答ヘッダーです。
私が知りたいのは:
サーバーから送信されたレスポンス ヘッダーから手動で収集し、ヘッダーを ajax リクエストにEtag
添付する必要がありますか?または、「Etag」がある場合if-no-match
、ブラウザーはデフォルトでリクエストでそれを送信しますconditional get
ブラウザのネットワーク コンソールを介してデバッグを行いましたが、ブラウザが
conditional GET
自動的に実行しているようで、if-no-match
ヘッダーが設定されています。それが正しければ、新しいリソースを作成し、get リクエストを呼び出したとします。過去にキャッシュされたデータが初めて表示されます。しかし、ページをリロードすると、更新されたページが表示されます。サーバー側のデータセットが変更され、別
Etag
の .
- ページネーションの場合も。URL があるとします
/users?next=0
。next is a query param
の値は、next
新しいリクエストごとに変化します。各応答は独自の「Etag」を取得するためです。ブラウザはリクエストに基づいて「Etag」を保存しますか、それともEtag
URL に関係なく、前回の get リクエストの最新のものを保存するだけですか。
rest - Etag トークンは HTTP の条件付き GET でどのように機能しますか?
したがって、基本的には、リクエストの If-None-Match ヘッダーの ETag トークン値の動作を理解したいと思います。
If-modifies-since条件付き GET メソッドの動作を理解しました。If-None-Match条件の Etag の場合に条件付き GET がどのように機能するかを誰かが簡単な言葉で説明できますか?
前もって感謝します :)
javascript - Etag を取得し、If-None-Match ヘッダーに設定された後続のリクエストで使用するのに最適なものは何ですか?
これについては他にも多くの質問がありますが、Node.jsはサーバー側の言語であるため、「Etagサポート」は、nodejsアプリがクライアントに返すコードを作成、送信、および処理することを指しているようです。私の場合、リソースを要求して送信せず、200 応答すべてをモバイル ユーザーが使用できるように firebase db に保存し、Etag 値をIf-None-Match
ヘッダーに一致させて返送するときに (304 ではなく) 別の 200 応答を取得したときに更新します。リソースに変更があるかどうかを確認するための追加のリクエスト。
また、この場合の適切な用語は何ですか。私がクライアントで、私のモバイル アプリ ユーザーが私のクライアントなので、彼らはクライアントのクライアントですか?
私はreqestを使用していて、ローカルetag
変数を設定するよりも簡単な方法があるかどうか疑問に思っていました。設定されていない場合は設定されているかどうかを確認してから、空のヘッダーのセットと空のヘッダーのセットを'If-None-Match'
使用し、応答でそれを取得するときに使用しますそのままつかむ
次に、それを取得してreturnEtag()
関数で返し、2 番目のヘッダー セットで使用する必要があります。
言うまでもなく、これは面倒です。アプリ全体でこれを実行して、etag
さまざまなリクエストごとに簡単/簡単な方法で管理する必要があります。これをすぐに処理できるモジュールはありますか?
ドキュメントには、次のことを行う必要があると記載されています
すべての応答は、HTTP Cache-Control ヘッダーを返します。その内容は、キャッシュされた応答を使用して不要な API 要求を減らすことができる期間を示します。この API にアクセスするクライアントは、この情報を考慮する必要があります。
それに加えて、各応答は HTTP ETag ヘッダーを返します。そのコンテンツは、HTTP If-None-Match ヘッダー内の同じリソースへの後続のリクエストで使用されます。キャッシュされた情報がまだ有効な場合、API はステータス コード 304 Not Modified を返します。この API にアクセスするクライアントは、条件付き GET とも呼ばれるこの手法を使用する必要があります。
私は自分のサーバーを使用してこのAPIにアクセスし、そのデータをfirebaseに保存して、モバイルアプリでユーザーにアクセスできるようにしています(この他社のAPIでアプリのキーをモバイルアプリユーザーから遠ざけます)。
android - Android OkHttp ETag の処理方法
OkHttp を使用して Android オフライン キャッシュ メソッドを実行しようとしています。流れは次のようになります。
- ヘッダー フィールド
if-none-catched
に ETag の空の文字列を含む HTTP 要求をサーバーに送信すると、サーバーは適切な ETag を返します。 - 次に、ETag を保存し、応答をキャッシュします。
- 次回同じサービス呼び出しを起動すると、同じ ETag が取得され、それが HTTP 要求ヘッダーに設定されます。ETag が同じ場合、サーバーは HTTP 304 を返します。
私の問題は、ETag をどのように保存および取得できるかということです。OkHttp のデフォルトは処理されますか、それとも SQLite に保存する必要がありますか? OkHttp実装ETagサンプルコードについてGoogleで調べ続けていますが、取得できるのは通常のキャッシュ方法だけです。私が参照するリンク:
- Java の HttpURLConnection を使用して「条件付き get」を実行しようとしていますが、304 ステータス コードを取得できません。
- https://github.com/square/okhttp/wiki/Interceptors
- Android で OkHttp のキャッシュを設定する正しい方法
- https://gist.github.com/polbins/1c7f9303d2b7d169a3b1#file-restcontroller-java-L45
これまでのところ、私が達成したのは、初回のサービス呼び出しのキャッシュのみですが、サーバーから最新のデータを取得することはもうありません。誰かが何らかのガイダンスを提供できるか、または ETag を処理if-none-catch
し、OkHttp が共有するために動的に処理する良い例を見つけた場合に感謝します。ご不明な点がございましたら、お気軽にお問い合わせください。
etag - Accept-Language を使用した ETag
今後の呼び出しで HTTP 304 (Not Modified) ステータスを利用できるように、各応答に ETag を付ける Web サービスがあります。私が生成する ETag は、実際にはクエリ タイプとタイムスタンプを Base64 でエンコードしたものです。
私が抱えている問題は、ブラウザーが Accept-Language が異なる同じリソースを要求する場合です。ブラウザーは現在、同じ If-None-Match ヘッダーを送信しているため、実際のリソースが別の言語で返されたとしても、応答は 304 です。したがって、これを行う方法は、Vary ヘッダーを追加して、以下に示すように、Accept と Accept-Language によって応答が異なることをクライアントに指定することだと考えました。
Vary:Accept、Accept-Language
ただし、受け入れ言語に関係なく、私のブラウザー (Chrome) は同じ ETag を使用します。ここで使用する正しい規則は何ですか?
ありがとう