2013-06-28 9 views
6

私はOkHttpとRetrofitを使ってHTTPリクエストをキャッシュしようとしています。しかし、なぜそれが働いていないのかわからない。アンドロイドでHTTPキャッシングができません

@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); 

これは、要求の1つであり、すべての必須ヘッダーがあります。さらに、何かがFile Cacheに書き込まれたことをテストするために、私は手動でOkHttpClientにキャッシュを割り当てました。

OkHttpClient name = new OkHttpClient(); 

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

私が作成したファイルキャッシュは36バイトしかないので、キャッシュされているものはありません。

また、サーバーにはヘッダーが必要であることを確認しようとしましたが、サーバーの干渉なしで動作させたいのですが、要求にキャッシュコントロールヘッダーも設定しました。これは改造からのデバッグログです。

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 

私はhttpのキャッシュ機構を何度も読んだことがありますが、何か不足しているようです。

+0

ちょっとでも似たような状況で私を助けることができます... http://stackoverflow.com/questions/22445177/trying-to-make-use-of-httpcache-android – Lion789

答えて

8

POSTレスポンスを実際にキャッシュすることはできません。代わりにGETメソッドを使用してください。ここでは、キャッシングとレトロフィットとOkHttpの実施例があります:

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

+0

何が最良の方法ですキャッシュPOST要求をローカルに、どのような改造モジュールの部分をそのように捉えるべきかまで拡張する必要があります。 – JehandadK

+0

デフォルトの場合、改造によって応答がキャッシュされないことが正しいと思いますか? – Janusz

0

@Jesseウィルソン - 私はそれが時々応答をキャッシュするために理にかなっていると思い - 私は、ユーザーのネットワーク呼び出しを行うアプリではなく、場合には働いていますアクティビティを切り替え、戻ってきます。私はPOSTレスポンスによって以前に返されたものと同じデータを使用したいと思います。 私はORMを使用してmuオブジェクトなどを使用できることは知っていますが、同じレスポンスを使用するように改造するように指示するほうがずっと簡単なようです。

+2

残念ながら、HTTP投稿をキャッシュするための良いセマンティクスはありません。あなたの最善の策は、[POST/REDIRECT/GET](http://en.wikipedia.org/wiki/Post/Redirect/Get)を使用するようにWebサービスを設定し、OkHttpが処理するべきものです。 –

+0

誰かが助けてくれれば、OkHttpを使ってキャッシュを正しく動作させることはできません... http://stackoverflow.com/questions/22445177/trying-to-make-use-of-httpcache-androidわかりませんもし私がそれを正しくやっていれば、私がそこに投げ込んだサービスは、それが何を意味するのかを確信していません – Lion789

関連する問題