使用 OkHttp 缓存 POST 个请求

Cache POST requests with OkHttp

我使用 OkHttp 向我的服务器发出一些 POST 请求。这很好用。 现在我想使用 OkHttp 的缓存来缓存请求的响应,并在设备离线时使用它们。 我尝试了其他问题的许多解决方案,但 none 有效。

我使用 OkHttp 2.5.0

使用下面的代码,当设备可以访问互联网时,我得到了有效的响应。 但是,如果我关闭互联网,它会抛出 java.net.UnknownHostException: 无法解析主机 "example.com": 没有与主机名关联的地址

这是我当前的代码,它不起作用:

改写缓存的拦截器headers:

private final Interceptor mCacheControlInterceptor = new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();

        if (isOnline()) {
            request.newBuilder()
                    .header("Cache-Control", "public, only-if-cached, max-stale=7887")
                    .build();
        } else {
            request.newBuilder()
                    .header("Cache-Control", "public, max-stale=2419200")
                    .build();
        }

        Response response = chain.proceed(request);

        // Re-write response CC header to force use of cache
        return response.newBuilder()
                .header("Cache-Control", "public, max-age=86400") // 1 day
                .build();
    }
};

获取客户​​端的方法:

private OkHttpClient getHttpClient() {
    if (mHttpClient == null) {
        mHttpClient = new OkHttpClient();
        mHttpClient.setConnectTimeout(CONNECT_TIMEOUT, TimeUnit.MILLISECONDS);

        File cacheDir = mContext.getDir(CACHE_NAME, Context.MODE_PRIVATE);
        mHttpClient.setCache(new Cache(cacheDir, CACHE_SIZE));

        mHttpClient.networkInterceptors().add(mCacheControlInterceptor);
    }

    return mHttpClient;
}

发出请求:

RequestBody body = RequestBody.create(TEXT, data);
Request request = new Request.Builder()
        .url(url)
        .post(body)
        .build();
Response response = getHttpClient().newCall(request).execute();

您不能使用 OkHttp 的缓存来缓存 POST 请求。您需要使用其他机制来存储它们。