手动缓存Rest,而不检查ETag和Last-Modified头信息

3

我正在使用 Rest 调用一个无法访问的远程服务器。我想要永久缓存接收到的数据以供离线使用,而不需要检查头文件中的 Last-ModifiedETag

我期望 CachingMode.MANUAL 机制会检查是否存在脱机内容,如果没有,则会在线获取内容,但它并没有这样做。

为了规避这个问题,我首先使用带有 CachingMode.OFFLINERest,如果返回404,则再使用带有 CachingMode.SMART 的另一个调用。

难道不应该有这样一种选项(比如说 CachingMode.OFFLINE_FIRST),它首先检查离线内容,如果没有内容,则使用 (CachingMode.SMART) 在线获取吗?

以下是我的当前方法:

Response<Map> response = Rest.get(url)
        .cacheMode(CachingMode.OFFLINE)
        .queryParam("param", value)
        .jsonContent().onErrorCodeJSON(e -> {
            throw new RuntimeException(createErrorMessage(e));
        }).onError(e -> {
            if (e.getResponseCode() == 0 || e.getConnectionRequest().getResponseCode() == 404) {
                is404 = true;
                return;
            }

            throw new RuntimeException("Network error. Please check your connection and try again.");
        }).timeout(6000).getAsJsonMap();

if (is404) {
    is404 = false;
    response = Rest.get(url)
            .cacheMode(CachingMode.SMART)
            .queryParam("param", value)
            .jsonContent().onErrorCodeJSON(e -> {
                throw new RuntimeException(createErrorMessage(e));
            }).onError(e -> {
                throw new RuntimeException("Network error. Please check your connection and try again.");
            }).timeout(6000).getAsJsonMap();
}

1
我认为这种缓存模式目前还不可用。但是,您在社区中发布的内容可能非常有用,甚至我曾经通过代码实现了类似的用例。 点赞! - Ayush28
你的断言:“我想永久缓存接收到的数据以供离线使用”,并不等同于将接收到的 JSON 下载到 Storage 或 FileSystemStorage 中,并使用该下载文件吗? - Francesco Galgani
@FrancescoGalgani 部分正确,但我不想重写整个下载代码,检查是否存在,如果不存在则获取新内容,并在需要时清除。 - Diamond
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接