Retrofit: o servidor retorna ETag e Cache-Control: max-age = 60. O cache não deve ser usado se a solicitação for 60s?

9

Estou usando o Retrofit, configurado para usar o OkHttp com um cache. Estou chamando esta api: link que retorna os cabeçalhos Etag e Cache-Control: public, max-age=60, s-maxage=60 .

Eu faço duas solicitações, em menos de 60 segundos, então esperava que a segunda não executasse nenhuma rede e usasse o cache, de acordo com a diretiva Cache-Control . Mas não é isso que vejo.

Acredito que isso ocorra porque a diretiva Etag tem precedência?

Esse comportamento correto / normal / esperado?

    
por BoD 28.09.2016 в 16:45
fonte

2 respostas

2

Protocolo de transferência de hipertexto RFC2068 - HTTP / 1.1 publicado em 1997 detalha os cabeçalhos ETag e Cache-Control . Documentos posteriores, RFC2616 e RFC7232 ambos expandem o cabeçalho ETag e como ele pode ser usado com If-None-Match .

RFC2616, 13.3 Modelo de validação contém a resposta para sua pergunta:

  

Quando um cache tem uma entrada obsoleta que gostaria de usar como      resposta ao pedido de um cliente, primeiro tem que verificar com a origem      servidor (ou possivelmente um cache intermediário com uma nova resposta) para      veja se sua entrada em cache ainda é utilizável. Nós chamamos isso de "validação"      a entrada de cache.

Em seguida, ele lista os modelos de validação, incluindo os validadores do Cache da Tag de Entidade (ETag) junto com as datas da Última Modificação. Uma entrada de cache obsoleta é aquela em que o maxage ou outro mecanismo de expiração ocorreu para esse recurso.

Portanto, o comportamento do seu sistema é inesperado. Pode valer a pena testar o conteúdo com e sem o cabeçalho ETag para verificar se o cache local está funcionando.

    
por Steve E. 08.12.2016 / 06:15
fonte
0

Você configurou o armazenamento em cache corretamente no retrofit? Algo como:

    // create the cache
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    builder.cache(new Cache(new File(context.getCacheDir(), "ok-http-cache"),
            1024 * 1024 * 5)); // 5 MB cache


    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(builder.build()) // set the cache created above
            .build();
    api = retrofit.create(Api.class); // Api is the interface with the @GET, @POST annotations

Isto é trivial se você souber, mas você não mencionou sua implementação

    
por vedant 08.12.2016 / 07:29
fonte