Menyimpan respons berdasarkan header tanggal dan usia

Jan 17 2021

Kami melihat beberapa perilaku di mana kami tidak menyimpan respons di OkHttp, dan akhirnya menyerang server setiap saat. Namun, respons tersebut memiliki waktu Kedaluwarsa di masa mendatang, jadi idealnya itu akan disimpan dalam cache.

Berikut adalah contoh sederhana dari tajuk yang kami lihat dalam tanggapan (permintaan dikirim dan tanggapan diterima di 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

Dari apa yang saya lihat dari melihat CacheStrategy, masalahnya adalah ia menambahkan tanggal + usia untuk melihat apakah sudah melewati waktu kedaluwarsa. Dalam kasus ini 00:40:36 + 6 = 00:40:42 > 00:40:40, jadi akhirnya tidak ditambahkan ke cache.

Jadi saya pikir idealnya, tanggal tanggapan akan sama dengan yang terakhir diubah (dalam hal ini Sab, 16 Jan 2021 00:40:30 GMT), atau kita perlu memiliki CacheStrategy khusus untuk menggunakan modifikasi terakhir daripada tanggal untuk perhitungan ini.

Jika ada yang memiliki wawasan tentang apakah saya membuat asumsi buruk, atau jika salah satu opsi di atas lebih disukai, beri tahu saya. Saya telah melihat beberapa spesifikasi untuk tanggal / usia tajuk dan agak tidak jelas bagi saya apa yang seharusnya dalam skenario ini.

Saya juga merasa agak sulit untuk men-debug perilaku caching di OkHttp, saat ini saya baru saja menggunakan breakpoint bersyarat untuk mencoba melacaknya, tetapi jika ada yang memiliki ide yang lebih baik, saya akan menghargainya juga.

Jawaban

2 JesseWilson Jan 22 2021 at 11:32

Ganti expirestajuk dengan tajuk Kontrol-Cache yang menetapkan arahan usia-maks:

Cache-Control: max-age=86400

Ini akan menyebabkan OkHttp menyimpan respons dalam cache selama 24 jam terlepas dari kapan respons itu ditayangkan. Header kedaluwarsa bermasalah karena CloudFlare memperlakukannya sebagai waktu kedaluwarsa tertentu, bukan durasi.

1 Menelaos Jan 26 2021 at 01:57

Saya akan merekomendasikan untuk mencoba menggunakan header "Cache-Control" dengan pilihan max-ageAnda.

Alasan utama saya melakukan ini adalah karena ini juga ditunjukkan dalam contoh dari dokumentasi resmi, lihat: https://square.github.io/okhttp/interceptors/#rewriting-responses

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

Cara yang disukai untuk melakukan ini jelas di bagian belakang. Jika Anda tidak dapat memodifikasi back-end, maka saya kira pencegat akan menjadi pilihan kedua. Perhatikan bahwa ini adalah opsi terakhir yang tidak disarankan.

Selain backend Anda, saya juga akan melihat opsi yang disediakan cloudflare itu sendiri: https://support.cloudflare.com/hc/en-us/articles/360021806811-Getting-Started-with-Cloudflare-Caching