2

我在使用 OkHttpClient 2.0 进行缓存时遇到问题。似乎响应完全忽略了 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 时,headers 如下。

< 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。有人可以建议这里可能需要进行哪些更改才能使缓存正常工作吗?谢谢。

4

3 回答 3

3

好的,问题是我所有的 get 和 post 请求都使用了 Authorization Bearer xxxx 标头,并且http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html第 14.8 节指出这些请求不能被缓存。解决方案是根据这个在服务器上使用 s-maxage 而不是 max age :

当共享缓存(参见第 13.7 节)接收到包含授权字段的请求时,它不得返回相应的响应作为对任何其他请求的回复,除非存在以下特定例外之一:

如果响应包含“s-maxage”缓存控制指令,缓存可以使用该响应来回复后续请求。

于 2014-07-03T20:50:02.583 回答
1

您正在阅读整个响应正文吗?除非您使用整个响应,否则 OkHttp 不会缓存。

于 2014-06-27T23:29:39.830 回答
0

我意识到你解决了你的具体问题,但你描述的症状有另一个原因。

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

connection.setUseCaches(true)

(它应该默认打开,但我使用的一些库将其设置为关闭)

于 2014-08-31T03:45:15.460 回答