Respostas em cache com base em cabeçalhos de data e idade

Jan 17 2021

Estamos vendo alguns comportamentos em que não estamos armazenando respostas em cache em OkHttp e acabamos acessando o servidor todas as vezes. No entanto, a resposta tem um tempo de expiração no futuro, portanto, o ideal é que ela seja armazenada em cache.

Aqui está um exemplo simples de cabeçalhos que vemos na resposta (a solicitação foi enviada e a resposta foi recebida em 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

Pelo que vi olhando para o CacheStrategy, o problema é que ele adiciona data + idade para ver se já passou do tempo de expiração. Nesse caso, 00:40:36 + 6 = 00:40:42 > 00:40:40então acaba não sendo adicionado ao cache.

Então, acho que o ideal é que a data de resposta seja igual à última modificação (neste caso, sábado, 16 de janeiro de 2021 00:40:30 GMT) ou precisaríamos ter um CacheStrategy personalizado para usar a última modificação em vez de data para esses cálculos.

Se alguém tiver alguma ideia se estou fazendo suposições erradas ou se uma das opções acima for preferível, entre em contato. Eu olhei algumas das especificações para cabeçalhos de data / idade e não está claro para mim o que eles deveriam ser neste cenário.

Também achei um pouco difícil depurar o comportamento de cache no OkHttp, agora estou usando apenas pontos de interrupção condicionais para tentar rastreá-lo, mas se alguém tiver uma ideia melhor, eu também agradeceria.

Respostas

2 JesseWilson Jan 22 2021 at 11:32

Substitua o expirescabeçalho por um cabeçalho Cache-Control que define uma diretiva max-age:

Cache-Control: max-age=86400

Isso fará com que o OkHttp armazene a resposta em cache por 24 horas, independentemente de quando ela foi veiculada. O cabeçalho expires era problemático porque CloudFlare tratou como um tempo de expiração específico, não uma duração.

1 Menelaos Jan 26 2021 at 01:57

Eu recomendaria tentar usar o cabeçalho "Cache-Control" com um max-agede sua escolha.

A principal razão de eu fazer isso é porque isso também é mostrado em um exemplo da documentação oficial, consulte: https://square.github.io/okhttp/interceptors/#rewriting-responses

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

A maneira preferida de fazer isso é obviamente no back-end. Se você não pode modificar o back-end, então acho que um interceptor seria uma segunda opção. Observe que essa é a última opção que não é recomendada.

Além de seu back-end, eu daria uma olhada também nas opções que o próprio cloudflare oferece:https://support.cloudflare.com/hc/en-us/articles/360021806811-Getting-Started-with-Cloudflare-Caching