Mise en cache des réponses en fonction des en-têtes de date et d'âge

Jan 17 2021

Nous constatons un comportement dans lequel nous ne mettons pas en cache les réponses dans OkHttp et finissons par frapper le serveur à chaque fois. Cependant, la réponse a une heure d'expiration dans le futur, donc idéalement, elle serait mise en cache.

Voici un exemple simple d'en-têtes que nous voyons dans la réponse (la demande a été envoyée et la réponse a été reçue à 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

D'après ce que j'ai vu en regardant CacheStrategy, le problème est qu'il ajoute la date + l'âge pour voir si l'heure d'expiration est dépassée. Dans ce cas, 00:40:36 + 6 = 00:40:42 > 00:40:40il ne sera donc pas ajouté au cache.

Donc, je pense qu'idéalement, soit la date de réponse serait égale à la dernière modification (dans ce cas, samedi 16 janvier 2021 00:40:30 GMT), soit nous aurions besoin d'une CacheStrategy personnalisée pour utiliser la dernière modification au lieu de date de ces calculs.

Si quelqu'un a des idées pour savoir si je fais de mauvaises hypothèses ou si l'une des options ci-dessus est préférable, veuillez me le faire savoir. J'ai regardé certaines des spécifications pour les en-têtes de date / âge et je ne sais pas trop ce qu'ils devraient être dans ce scénario.

J'ai également trouvé un peu difficile de déboguer le comportement de mise en cache dans OkHttp, pour le moment, je viens d'utiliser des points d'arrêt conditionnels pour essayer de le tracer, mais si quelqu'un a une meilleure idée, je l'apprécierais également.

Réponses

2 JesseWilson Jan 22 2021 at 11:32

Remplacez l'en- expirestête par un en-tête Cache-Control qui définit une directive max-age:

Cache-Control: max-age=86400

Cela obligera OkHttp à mettre en cache la réponse pendant 24 heures, quel que soit le moment où elle a été diffusée. L'en-tête expires était problématique car CloudFlare le traitait comme une heure d'expiration spécifique et non comme une durée.

1 Menelaos Jan 26 2021 at 01:57

Je recommanderais d'essayer d'utiliser l'en-tête "Cache-Control" avec un max-agede votre choix.

La principale raison pour laquelle je fais cela est que cela est également montré dans un exemple de la documentation officielle, voir: https://square.github.io/okhttp/interceptors/#rewriting-responses

.header("Cache-Control", "max-age=60")

La meilleure façon de le faire est évidemment sur le back-end. Si vous ne pouvez pas modifier le back-end, alors je suppose qu'un intercepteur serait une deuxième option. Notez que c'est une dernière option déconseillée.

En plus de votre backend, je voudrais également jeter un coup d'œil aux options fournies par cloudflare lui-même: https://support.cloudflare.com/hc/en-us/articles/360021806811-Getting-Started-with-Cloudflare-Caching