2016-09-28 44 views
9

Używam Retrofit, skonfigurowany do używania OkHttp z pamięcią podręczną. Zadzwonię do tej api: https://api.github.com/users/bod/repos, która zwraca zarówno nagłówki Etag, jak i oraz .Retrofit: serwer zwraca zarówno ETag, jak i Cache-Control: max-age = 60. Czy nie należy używać pamięci podręcznej na żądanie <60s?

Wykonuję dwie prośby, w mniej niż 60 sekund, więc spodziewałem się, że drugi nie wykona żadnej sieci i nie użyje pamięci podręcznej zgodnie z dyrektywą Cache-Control. Ale to nie jest to, co widzę.

Zgaduję, że to dlatego, że dyrektywa Etag ma pierwszeństwo?

Czy to prawidłowe/normalne/oczekiwane zachowanie?

+0

Możesz dodać informacje, w jaki sposób skonfigurować buforowanie w modernizacji? – tynn

Odpowiedz

2

RFC2068 Hypertext Transfer Protocol -- HTTP/1.1 opublikowane w 1997 roku szczegóły dotyczące nagłówków ETag i Cache-Control. Późniejsze dokumenty: RFC2616 i RFC7232 rozwijają się w nagłówku ETag i mogą być używane z If-None-Match.

RFC2616, 13.3 Validation Model zawiera odpowiedź na pytanie:

Gdy pamięć podręczna ma nieświeży wpis, który chciałaby wykorzystywać jako odpowiedź na życzenie klienta, to musi najpierw skontaktować się z serwerem pochodzenie (lub prawdopodobnie pośrednia pamięć podręczna ze świeżą odpowiedzią) na zobacz, czy jego zapis w pamięci podręcznej jest nadal użyteczny. Nazywamy to "sprawdzaniem poprawności" wpisami pamięci podręcznej.

Następnie przechodzi się do listy modeli walidacji, w tym podmiot Tag (ETAG) walidatorami Cache wraz z Last-Modified terminach. Wbudowany wpis pamięci podręcznej to taki, w którym wystąpił maxage lub inny mechanizm wygaśnięcia tego zasobu.

Tak więc zachowanie systemu jest nieoczekiwane. Warto przetestować zawartość zi bez nagłówka ETag, aby sprawdzić, czy lokalna pamięć podręczna działa w ogóle.

0

Czy poprawnie skonfigurowałeś buforowanie w modernizacji? Coś jak:

// 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 

To jest trywialne, jeśli znasz go, ale nie wspomniał implementacja

+0

Tak, rzeczywiście zrobiłem :) – BoD

+0

@ vedant1811 jest to uważane buforowanie sieci? Jaki rodzaj buforowania jest to specjalnie nazywane i jaki jest przypadek użycia? – toobsco42

+0

@ toobsco42 to buforowanie po stronie klienta - służy do zapobiegania nadmiarowym połączeniom sieciowym tego samego typu. Ale nie jestem ekspertem od informatyki – vedant1811