使用OkHttp缓存POST请求

时间:2015-09-22 21:54:18

标签: android caching okhttp

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

我使用OkHttp 2.5.0

使用下面的代码,当设备可以访问互联网时,我会收到有效的回复。 但是,如果我关闭互联网,它会抛出一个java.net。dato.FechaIngreso = dr.IsDBNull(6) ? default(DateTime) : dr.GetDateTime(6); :无法解析主机“example.com”:没有与主机名关联的地址

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

用于重写缓存标头的拦截器:

UnknownHostException

获取客户的方法:

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;
}

1 个答案:

答案 0 :(得分:11)

您无法使用OkHttp的缓存缓存POST请求。您需要使用其他一些机制来存储它们。