2013-06-28 17 views
6

Próbowałem użyć OkHttp i Retrofit do buforowania żądań HTTP. Ale nie wiem, dlaczego to nie działa.Nie można uzyskać buforowania HTTP w Androidzie

@Headers("Cache-Control: public, max-age=640000, s-maxage=640000 , max-stale=10000000") 
    @FormUrlEncoded 
    @POST("/news/getNewslist/") 
    void newsListByGenre(@Field("news_genre") String genre, 
      Callback<ArrayList<NewsStory>> callback); 

Jest to jedno z żądań, ma wszystkie wymagane nagłówki. Co więcej, próbując przetestować, że coś jest zapisane w buforze plików, ręcznie przypisałem pamięć podręczną do OkHttpClient.

OkHttpClient name = new OkHttpClient(); 

      try { 
       if (!cache.exists()) 
        cache.createNewFile(); 
       name.setResponseCache(new HttpResponseCache(cache, 
         10 * 1024 * 1024)); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

Utworzona przeze mnie pamięć podręczna plików ma tylko 36 bajtów, więc jestem pewien, że nic nie jest buforowane.

Próbowałem również upewnić się, że serwer ma wymagane nagłówki, chociaż chcę, aby działał bez zakłóceń serwera, ale ustawiłem również nagłówki kontroli pamięci podręcznej w żądaniu. To jest dziennik debugowania z retrofitu.

null: HTTP/1.1 200 OK 
Cache-Control: public, max-age=360000 
Connection: Keep-Alive 
Content-Length: 5167 
Content-Type: application/json 
Date: Fri, 28 Jun 2013 01:00:22 GMT 
Keep-Alive: timeout=5, max=99 
Server: Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7 
X-Android-Received-Millis: 1372381311315 
X-Android-Response-Source: NETWORK 200 
X-Android-Selected-Transport: http/1.1 
X-Android-Sent-Millis: 1372381311048 
X-Powered-By: PHP/5.4.7 

Przeczytałem mechanizm buforowania http raz po raz, ale wydaje mi się, że czegoś brakuje.

+0

Hej, czy przypadkiem nie możesz mi pomóc w podobnej sytuacji ... http://stackoverflow.com/questions/22445177/trying-to-make-use-of-httpcache-android – Lion789

Odpowiedz

8

Nie można naprawdę buforować odpowiedzi POST. Zamiast tego należy użyć metody GET. Oto przykład pracy z Retrofit i OkHttp z buforowania:

https://gist.github.com/swankjesse/5889518

+0

Jaki jest najlepszy sposób cache POST żąda lokalnie, jaka część modułu modernizacyjnego powinna zostać rozszerzona, aby uzyskać takie. – JehandadK

+0

Czy widzę to poprawnie, że modernizacja nie buforuje odpowiedzi, jeśli domyślnie? – Janusz

0

@Jesse Wilson - Myślę, że to ma sens, aby buforować odpowiedzi czasami - Pracuję nad app, który sprawia, że ​​połączenia sieciowe, ale jeśli użytkownik przełącza działania i wraca Chciałbym użyć tych samych danych, które zostały wcześniej zwrócone przez odpowiedź POST. Wiem, że mogę używać ORM i utrzymywać obiekty mu itp., Wydaje mi się, że o wiele łatwiej byłoby powiedzieć o modernizacji, aby użyć tej samej odpowiedzi.

+2

Niestety nie ma dobrej semantyki do buforowania postów HTTP. Najlepszym rozwiązaniem jest skonfigurowanie usługi sieciowej do używania [POST/REDIRECT/GET] (http://en.wikipedia.org/wiki/Post/Redirect/Get), którą powinien obsługiwać OkHttp. –

+0

Nie mogę sprawić, aby buforowanie działało poprawnie przy użyciu OkTH, jeśli ktoś może pomóc ... http://stackoverflow.com/questions/22445177/trying-to-make-use-of-httpcache-android Nie jestem pewien jeśli robię to dobrze, a jeśli tak, to służba, którą właśnie tam rzuciłam i nie wiem, z czym powinna się utożsamiać – Lion789

Powiązane problemy