【问题标题】:Cache Control gets ignored缓存控制被忽略
【发布时间】:2014-04-24 15:57:54
【问题描述】:

我目前正在使用 Retrofit 和 Okhttp,我正在尝试缓存一些 GET 响应。 我的代码是:

OkHttpClient okHttpClient = new OkHttpClient();
    File cacheDir = new File(System.getProperty("java.io.tmpdir"),
            "ddcache");
    HttpResponseCache cache = new HttpResponseCache(cacheDir, 2024);
    okHttpClient.setResponseCache(cache);
    OkClient cl=new OkClient(okHttpClient);
    restAdapter = new RestAdapter.Builder().setEndpoint(API_URL)
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .setClient(cl).build();

日志显示这个标题:

HTTP/1.1 200 OK
Cache-Control: max-age=7200
Connection: Keep-Alive
Content-Type: text/html
Date: Tue, 18 Mar 2014 18:38:16 GMT
Keep-Alive: timeout=3, max=100
OkHttp-Received-Millis: 1395167895452
OkHttp-Response-Source: NETWORK 200
OkHttp-Sent-Millis: 1395167895378
Server: Apache/2.2.26 (Unix)
Transfer-Encoding: chunked
X-Powered-By: PHP/5.3.28

我通过在每次调用时返回服务器 Unix 时间来检查响应,它总是返回一个新的,这意味着

缓存控制:max-age=7200

被完全忽略 缓存中的日志文件也使用“CLEAN”和“DIRTY”注释进行更新,但没有缓存任何内容。 有什么我看不到的明显的东西吗?

【问题讨论】:

  • 您的请求是什么样的?我无法在测试中重现该问题。 gist.github.com/swankjesse/a2fba4b1277b4cf4c973
  • 好的,我试过你的例子,它在给定的文件夹中缓存了一些东西。也许它与服务器时间或其他什么有关。如果我查看日志文件,它会被写入但立即被删除。
  • 啊,我猜你没有阅读完整的 HTTP 响应正文,这会导致缓存响应被中止。您使用的是 OkHttp 1.5.2 吗?它可能会修复。
  • 是的。我正在使用 OkHttp 1.5.2 和最新的 RetroFit。所以我想我确实阅读了完整的请求。正如 here 提议的那样,我确实将 max-stale 标头添加到我的请求中,但请求仍然不会被缓存。

标签: java http okhttp


【解决方案1】:

我想我也有类似的问题。缓存的大小以千字节为单位设置,而您将其设置为仅 2024 千字节。几乎没有足够的空间容纳任何东西。尝试将其设置为“10L * 1024 * 1024”(10Mb),看看是否有帮助。

【讨论】:

  • 你说得很好。稍后会尝试并报告。目前使用一些我觉得不舒服的自定义方法。
猜你喜欢
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2021-08-26
  • 2016-10-23
  • 1970-01-01
相关资源
最近更新 更多