我有一个页面返回以下缓存头:
Last-Modified: Wed, 07 Aug 2019 14:21:11 GMT
Cache-Control: max-age=1800, must-revalidate
哪种AFAIK是完全合法的语法,它要求客户端每次检查新版本,但仅在更改后才获取新版本(If-Modified-Since
标头的用例)。
但是,the example code from Apache HttpClient documentation无效。
在尝试深入研究代码之前,我有个简单的循环思路:
CacheConfig cacheConfig = CacheConfig.custom().setMaxCacheEntries(1000).setMaxObjectSize(8192).build();
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30000).setSocketTimeout(30000).build();
CloseableHttpClient cachingClient = CachingHttpClients.custom().setCacheConfig(cacheConfig).setDefaultRequestConfig(requestConfig)
.build();
for(int i = 0; i < 4; i++)
{
HttpCacheContext context = HttpCacheContext.create();
HttpGet httpget = new HttpGet(appUrl);
CloseableHttpResponse response = cachingClient.execute(httpget, context);
System.out.println(response.getStatusLine() + "\t" + context.getCacheResponseStatus());
response.close();
}
令我惊讶的是,输出是:
HTTP/1.1 200 OK CACHE_MISS
HTTP/1.1 200 OK CACHE_MISS
HTTP/1.1 200 OK CACHE_HIT
HTTP/1.1 200 OK CACHE_HIT
这意味着高速缓存仅在第一次时不起作用(因此,在第二次调用时,应从高速缓存中返回版本)。所有后续请求均按预期工作。
在通话前添加超时不会改变任何内容。第一个请求不写任何内容要缓存,第二个请求不写缓存,但保存到缓存,所有后续请求都从缓存中获取版本。
我在这里错过了一些琐碎的事情吗,或者这是一个错误?我正在使用最新版本的apache httpclient:https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient-cache/4.5.9