java - okhttp客户端什么时候缓存服务器响应?

标签 java okhttp

我在java中使用okhttp客户端3.5.0来缓存响应,服务器响应具有以下缓存控制 header :

缓存控制:私有(private),max-age=0,必须重新验证

首先,我尝试进行实际的网络调用来获取服务器响应,然后在第二个请求中我想获取缓存的响应。

这是我的java代码:

HttpUrl.Builder httpUrlBuilder = HttpUrl.parse(serverUrl).newBuilder();

HttpUrl httpUrl = httpUrlBuilder.build();

Request request = new Request.Builder()
    .url(httpUrl)
    .cacheControl(new CacheControl.Builder().maxAge(1, TimeUnit.DAYS).build())
    .build();

Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {

    }

    @Override
    public void onResponse(Call call, final Response response) throws IOException {

        System.out.println("***************Response 1**************");

        System.out.println("isSucess:"+response.isSuccessful());

        Response text = response.cacheResponse();

        System.out.println("Cached Response:" + text);

        Response networkResponse = response.networkResponse();

        System.out.println("Network Response ::" +networkResponse);

    }
});

Thread.sleep(5000);


Request request2 = new Request.Builder()
    .cacheControl(new CacheControl.Builder().onlyIfCached().build())
    .url(httpUrlBuilder.build())
    .build();


call = okHttpClient.newCall(request2);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {

    }

    @Override
    public void onResponse(Call call, final Response response) throws IOException {
        System.out.println("***********Response 2************");

        System.out.println("isSucess:" +response.isSuccessful());

        final Response text = response.cacheResponse();

        System.out.println("Cached Response:" + text);

        Response networkResponse = response.networkResponse();

        System.out.println("Network Response:" +networkResponse);

    }
});

下面是第二个请求输出:(部分输出)

************响应 2************

是否成功:假

缓存响应:空

网络响应:空

我是否遗漏了什么?

最佳答案

除非您读取并关闭响应正文,否则 OkHttp 不会缓存响应。这就是触发下载和保存这些字节的原因。

try {
  if (response.cacheResponse() == null) {
    body.source().skip(Long.MAX_VALUE); // Exhaust response body.
  }
} finally {
  body.close();
}

关于java - okhttp客户端什么时候缓存服务器响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41661245/

相关文章:

java - 如何清除 Eclipse 内部 Web 浏览器历史记录或浏览器首选项?

java - Curl 到 okhttp 转换

android - 为什么 OkHttp 会默默地替换掉 ws ://or wss://schemes?

java - Android - Log 类型未定义方法 i(String, String)

java - "The method Double(String) is undefined"(如何转换为双倍?)

java - 在 Firebase 上传的自定义对话框上设置 ProgressBar

java - 找不到@ScenarioTest

java - 如何在另一个类中执行异步 OkHttp 请求,然后回调到 Activity

android - Picasso Android 图片加载——线程模型

retrofit - 在 okhttp 中,我想处理 Last-Modified 和 ETags,但不缓存整个响应