日付と年齢のヘッダーに基づくキャッシュ応答
OkHttpで応答をキャッシュせず、毎回サーバーにアクセスするという動作が見られます。ただし、応答には将来の有効期限があるため、理想的にはキャッシュされます。
応答に表示されるヘッダーの簡単な例を次に示します(要求が送信され、応答がで受信されましたSat, 16 Jan 2021 00:40:36 GMT
)。
date: Sat, 16 Jan 2021 00:40:36 GMT
age: 6
expires: Sat, 16 Jan 2021 00:40:40 GMT
last-modified: Sat, 16 Jan 2021 00:40:30 GMT
CacheStrategyを見て私が見たところ、問題は、日付と年齢を合計して、有効期限を過ぎているかどうかを確認することです。この場合00:40:36 + 6 = 00:40:42 > 00:40:40
、、なので、キャッシュに追加されないことになります。
したがって、理想的には、応答日が最終変更日と同じになるか(この場合、2021年1月16日土曜日00:40:30 GMT)、または代わりに最終変更日を使用するカスタムCacheStrategyが必要になると思います。これらの計算の日付。
私が悪い仮定をしているのかどうかについて誰かが洞察を持っている場合、または上記のオプションのいずれかが望ましい場合は、私に知らせてください。日付/年齢ヘッダーの仕様をいくつか見てきましたが、このシナリオでそれらがどうあるべきかは少しわかりません。
また、OkHttpでのキャッシュ動作のデバッグが少し難しいこともわかりました。現在、条件付きブレークポイントを使用してトレースを試みていますが、誰かがより良いアイデアを持っている場合は、それもありがたいです。
回答
expires
ヘッダーを、max-ageディレクティブを設定するCache-Controlヘッダーに置き換えます。
Cache-Control: max-age=86400
これにより、OkHttpは、いつ提供されたかに関係なく、応答を24時間キャッシュします。CloudFlareがそれを期間ではなく特定の有効期限として扱ったため、expiresヘッダーには問題がありました。
選択した「Cache-Control」ヘッダーを使用してみることをお勧めしmax-age
ます。
私がこれを行う主な理由は、これが公式ドキュメントの例にも示されているためです。以下を参照してください。 https://square.github.io/okhttp/interceptors/#rewriting-responses
.header("Cache-Control", "max-age=60")
これを行うための好ましい方法は、明らかにバックエンドです。バックエンドを変更できない場合は、インターセプターが2番目のオプションになると思います。これは推奨されない最後のオプションであることに注意してください。
あなたのバックエンドに加えて、私はcloudflare自体が提供するオプションも見ていきます: https://support.cloudflare.com/hc/en-us/articles/360021806811-Getting-Started-with-Cloudflare-Caching