Memorizzazione nella cache delle risposte in base alla data e alle intestazioni di età
Stiamo riscontrando un comportamento in cui non memorizziamo le risposte nella cache in OkHttp e finiamo per colpire il server ogni volta. Tuttavia, la risposta ha un tempo di scadenza in futuro, quindi idealmente sarebbe memorizzata nella cache.
Ecco un semplice esempio di intestazioni che vediamo nella risposta (la richiesta è stata inviata e la risposta è stata ricevuta a 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
Da quello che ho visto guardando la CacheStrategy, il problema è che somma data + età per vedere se è passato il tempo di scadenza. In questo caso, 00:40:36 + 6 = 00:40:42 > 00:40:40
quindi, non viene aggiunto alla cache.
Quindi penso che idealmente, o la data di risposta sarebbe uguale all'ultima modifica (in questo caso sabato, 16 gennaio 2021 00:40:30 GMT), oppure avremmo bisogno di una CacheStrategy personalizzata per utilizzare l'ultima modifica invece di data per questi calcoli.
Se qualcuno ha qualche idea sul fatto che io stia facendo ipotesi sbagliate o se una delle opzioni di cui sopra è preferibile, per favore fatemelo sapere. Ho esaminato alcune delle specifiche per le intestazioni di data / età e non mi è chiaro cosa dovrebbero essere in questo scenario.
Ho anche trovato un po 'difficile eseguire il debug del comportamento di memorizzazione nella cache in OkHttp, in questo momento ho appena usato i punti di interruzione condizionali per provare a rintracciarlo, ma se qualcuno ha un'idea migliore lo apprezzerei anche io.
Risposte
Sostituisci l' expires
intestazione con un'intestazione Cache-Control che imposta una direttiva max-age:
Cache-Control: max-age=86400
Ciò farà sì che OkHttp memorizzi nella cache la risposta per 24 ore indipendentemente da quando è stata pubblicata. L'intestazione expires era problematica perché CloudFlare la trattava come una data di scadenza specifica, non una durata.
Consiglierei di provare a usare l'intestazione "Cache-Control" con una max-age
di tua scelta.
Il motivo principale per cui lo faccio è perché questo è mostrato anche in un esempio dalla documentazione ufficiale, vedi: https://square.github.io/okhttp/interceptors/#rewriting-responses
.header("Cache-Control", "max-age=60")
Il modo preferito per farlo è ovviamente sul back-end. Se non puoi modificare il back-end, immagino che un intercettore sarebbe una seconda opzione. Nota che è l'ultima opzione che è sconsigliata.
Oltre al tuo backend, darei un'occhiata anche alle opzioni fornite dallo stesso cloudflare: https://support.cloudflare.com/hc/en-us/articles/360021806811-Getting-Started-with-Cloudflare-Caching