Zwischenspeichern von Antworten basierend auf Datums- und Altersüberschriften
Wir sehen ein Verhalten, bei dem wir keine Antworten in OkHttp zwischenspeichern und jedes Mal auf den Server gelangen. Die Antwort hat jedoch eine Ablaufzeit in der Zukunft, sodass sie im Idealfall zwischengespeichert wird.
Hier ist ein einfaches Beispiel für Header, die wir in der Antwort sehen (Anfrage wurde gesendet und Antwort wurde empfangen um 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
Nach dem, was ich bei der Betrachtung der CacheStrategy gesehen habe, besteht das Problem darin, dass Datum und Alter addiert werden, um festzustellen, ob die Ablaufzeit überschritten ist. In diesem Fall wird 00:40:36 + 6 = 00:40:42 > 00:40:40
es also nicht zum Cache hinzugefügt.
Ich denke also, im Idealfall wäre entweder das Antwortdatum gleich der zuletzt geänderten (in diesem Fall Sa, 16. Januar 2021 00:40:30 GMT), oder wir benötigen eine benutzerdefinierte CacheStrategy, um die zuletzt geänderte anstelle von zu verwenden Datum für diese Berechnungen.
Wenn jemand Einblicke hat, ob ich schlechte Annahmen mache oder ob eine der oben genannten Optionen vorzuziehen ist, lassen Sie es mich bitte wissen. Ich habe mir einige Spezifikationen für Datums- / Altersüberschriften angesehen und es ist mir ein bisschen unklar, wie sie in diesem Szenario aussehen sollten.
Ich fand es auch etwas schwierig, das Caching-Verhalten in OkHttp zu debuggen. Im Moment habe ich nur bedingte Haltepunkte verwendet, um zu versuchen, es zu verfolgen, aber wenn jemand eine bessere Idee hat, würde ich das auch begrüßen.
Antworten
Ersetzen Sie den expires
Header durch einen Cache-Control-Header, der eine Max-Age-Direktive festlegt:
Cache-Control: max-age=86400
Dies führt dazu, dass OkHttp die Antwort 24 Stunden lang zwischenspeichert, unabhängig davon, wann sie bereitgestellt wurde. Der abgelaufene Header war problematisch, da CloudFlare ihn als bestimmte Ablaufzeit und nicht als Dauer behandelte.
Ich würde empfehlen, den "Cache-Control" -Header mit einem max-age
Ihrer Wahl zu verwenden.
Der Hauptgrund, warum ich das mache, ist, dass dies auch in einem Beispiel aus der offiziellen Dokumentation gezeigt wird, siehe: https://square.github.io/okhttp/interceptors/#rewriting-responses
.header("Cache-Control", "max-age=60")
Der bevorzugte Weg, dies zu tun, ist offensichtlich das Back-End. Wenn Sie das Back-End nicht ändern können, ist ein Interceptor wahrscheinlich eine zweite Option. Beachten Sie, dass dies eine letzte Option ist, von der abgeraten wird.
Zusätzlich zu Ihrem Backend würde ich mir auch die Optionen ansehen, die Cloudflare selbst bietet: https://support.cloudflare.com/hc/en-us/articles/360021806811-Getting-Started-with-Cloudflare-Caching