OkHttpClient 2.0缓存问题

时间:2014-06-27 21:17:24

标签: android http-caching okhttp

我在使用OkHttpClient 2.0进行缓存时遇到问题。似乎Response完全忽略了Cache-Control标头。这就是我设置客户端和缓存的方式。

OkHttpClient client = new OkHttpClient();
cache = new Cache(new File(Session.getInstance().getContext().getCacheDir(),"http"), 10 * 1024 * 1024); 
client.setCache(cache);
client.setCookieHandler(CookieHandler.getDefault());
client.setConnectTimeout(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);
client.setReadTimeout(SOCKET_TIMEOUT, TimeUnit.MILLISECONDS);

我相信正确创建了缓存目录。这是我在日志中看到的应用程序的/ cache / http目录。

libcore.io.DiskLruCache
1
201105
2

这就是我创建请求的方式。

Request mRequest =  new Request.Builder().url(mUrl).get().build();

获得回复:

Response response = client.newCall(mRequest).execute();         

使用curl时,标题如下所示。

< HTTP/1.1 200 OK
< Date: Fri, 27 Jun 2014 19:39:40 GMT
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< Cache-Control: no-transform, max-age=1800
< Content-Type: application/json
< Transfer-Encoding: chunked

OKHttp响应标头如下。

Connection:Keep-Alive
Content-Type:application/json
Date:Fri, 27 Jun 2014 18:58:30 GMT
Keep-Alive:timeout=5, max=100
OkHttp-Received-Millis:1403895511337
OkHttp-Selected-Protocol:http/1.1
OkHttp-Sent-Millis:1403895511140
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked

响应永远不会被缓存,并且调用client.getCache()。getHitCount()总是给出0.有人可以建议可能需要进行哪些更改才能使缓存工作?感谢。

3 个答案:

答案 0 :(得分:3)

好的,问题是我所有的get和post请求都使用了Authorization Bearer xxxx标头,http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html第14.8节说明这些请求无法缓存。解决方案是在服务器上使用s-maxage,而不是根据这个使用最大年龄:

  

当共享缓存(请参阅第13.7节)收到请求时         包含授权字段,它不能返回         作为对任何其他请求的回复的相应响应,除非一个         以下具体例外情况如下:

     

如果回复中包含&#34; s-maxage&#34;高速缓存控制            指令,缓存可以在回复时使用该响应            后续请求。

答案 1 :(得分:1)

您是否正在阅读整个回复机构?除非您使用整个响应,否则OkHttp不会缓存。

答案 2 :(得分:0)

我意识到你解决了你的具体问题,但你描述的症状还有其他原因。

使用okhttp-urlconnection时,默认情况下缓存不会启动,除非我们这样做:

connection.setUseCaches(true)

(它应默认开启,但我正在使用的某些库将其设置为关闭)