gpt4 book ai didi

java - 如何强制缓存所有 HTTP 响应?

转载 作者:行者123 更新时间:2023-11-29 09:10:37 25 4
gpt4 key购买 nike

我正在使用 DefaultHTTPClient 发出一些 HTTP GET 请求。我想强制缓存所有 HTTP 响应一周。在浏览了文档和一些 SO 答案之后,我已经这样做了:

我通过主要 Activity 的 onCreate 方法安装了一个 HttpResponseCache

    try {
File httpCacheDir = new File(getApplicationContext().getCacheDir(), "http");
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
HttpResponseCache.install(httpCacheDir, httpCacheSize);
} catch (IOException e) {
Log.i("dd", "HTTP response cache installation failed:" + e);
}

我为我的 HTTP 客户端添加了自定义 HttpResponseInterceptor,但我仍然没有获得缓存命中。这是我的响应拦截器,它解压缩 GZIP 压缩的内容、剥离缓存 header 并添加自定义 header :

class Decompressor implements HttpResponseInterceptor {

public void process(HttpResponse hreResponse, HttpContext hctContext) throws HttpException, IOException {

hreResponse.removeHeaders("Expires");
hreResponse.removeHeaders("Pragma");
hreResponse.removeHeaders("Cache-Control");
hreResponse.addHeader("Cache-Control", "max-age=604800");

HttpEntity entity = hreResponse.getEntity();

if (entity != null) {
Header ceheader = entity.getContentEncoding();
if (ceheader != null) {
HeaderElement[] codecs = ceheader.getElements();
for (int i = 0; i < codecs.length; i++) {
if (codecs[i].getName().equalsIgnoreCase("gzip")) {
hreResponse.setEntity(new HttpEntityWrapper(entity) {
@Override
public InputStream getContent() throws IOException, IllegalStateException {
return new GZIPInputStream(wrappedEntity.getContent());
}

@Override
public long getContentLength() {
return -1;
}
});
return;
}
}
}
}
}

}

以下是我提出请求的方式:

String strResponse = null;

HttpGet htpGet = new HttpGet(strUrl);
htpGet.addHeader("Accept-Encoding", "gzip");
htpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1");
DefaultHttpClient dhcClient = new DefaultHttpClient();
dhcClient.addResponseInterceptor(new Decompressor(), 0);
HttpResponse resResponse = dhcClient.execute(htpGet);
Log.d("helpers.network", String.format("Cache hit count: %d", HttpResponseCache.getInstalled().getHitCount()));

strResponse = EntityUtils.toString(resResponse.getEntity());

return strResponse;

我似乎无法确定我做错了什么。你们有人知道吗?

最佳答案

不确定这是否回答了您的问题,但是您是否考虑过使用 Android 自己的缓存目录简单地添加客户端缓存,而不是依赖 HTTP 服务器解释您的缓存控制 header ?

我们在 ignition 中所做的只是将服务器响应作为字节流写入磁盘,从而完全控制缓存(和过期缓存)。

有一个示例应用 here ,但它需要您使用库的 HTTP API(然而,它只是 HttpClient 的一个薄包装。)或者简单地查看缓存的工作原理并从那里开始。

关于java - 如何强制缓存所有 HTTP 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12639922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com