我正在尝试使用cachingHttpClient缓存HTTP响应,但是徒劳无功。 这是我通过引用此链接http://hc.apache.org/httpcomponents-client-ga/tutorial/html/caching.html
放在一起的演示 public class CacheDemo {
public static void main(String[] args) {
CacheConfig cacheConfig = new CacheConfig();
cacheConfig.setMaxCacheEntries(1000);
cacheConfig.setMaxObjectSizeBytes(1024 * 1024);
HttpClient cachingClient = new CachingHttpClient(new DefaultHttpClient(), cacheConfig);
HttpContext localContext = new BasicHttpContext();
sendRequest(cachingClient, localContext);
CacheResponseStatus responseStatus = (CacheResponseStatus) localContext.getAttribute(
CachingHttpClient.CACHE_RESPONSE_STATUS);
checkResponse(responseStatus);
sendRequest(cachingClient, localContext);
responseStatus = (CacheResponseStatus) localContext.getAttribute(
CachingHttpClient.CACHE_RESPONSE_STATUS);
checkResponse(responseStatus);
}
static void sendRequest(HttpClient cachingClient, HttpContext localContext) {
HttpGet httpget = new HttpGet("http://www.mydomain.com/content/");
HttpResponse response = null;
try {
response = cachingClient.execute(httpget, localContext);
} catch (ClientProtocolException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
HttpEntity entity = response.getEntity();
try {
EntityUtils.consume(entity);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
static void checkResponse(CacheResponseStatus responseStatus) {
switch (responseStatus) {
case CACHE_HIT:
System.out.println("A response was generated from the cache with no requests "
+ "sent upstream");
break;
case CACHE_MODULE_RESPONSE:
System.out.println("The response was generated directly by the caching module");
break;
case CACHE_MISS:
System.out.println("The response came from an upstream server");
break;
case VALIDATED:
System.out.println("The response was generated from the cache after validating "
+ "the entry with the origin server");
break;
}
}
}
这是一个简单的程序,但我无法弄清楚我哪里出错了。非常感谢您的帮助。感谢。
答案 0 :(得分:4)
使用网址http://www.mydomain.com/content/的GET请求最终将使用Http 404代码(未找到)。这个结果很可能不会被高速缓存,所以这就是为什么它对我不起作用的原因。
<强>更新强>
必须满足某些条件才能从缓存中提供响应。
您应该启用apache http客户端的日志记录(例如http://hc.apache.org/httpclient-3.x/logging.html)。您可以调试正在进行的操作以及为什么您的其他URL存在缓存未命中。您可能应该下载该库的源代码并查看(http://hc.apache.org/downloads.cgi)。特别是你会对org.apache.http.impl.client.cache.CachedResponseSuitabilityChecker
课感兴趣。这也可以帮助您进行以下的库开发。
顺便说一下。 http://muvireviews.com/celebrity/full_view/41/Shahrukh-khan返回此标题:
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0, no-cache, no-store
并且由于CachedResponseSuitabilityChecker
中的if语句:
if (HeaderConstants.CACHE_CONTROL_NO_CACHE.equals(elt.getName())) {
log.trace("Response contained NO CACHE directive, cache was not suitable");
return false;
}
不会使用缓存。
祝你好运;)答案 1 :(得分:0)
默认情况下,CachingHttpClient假设共享缓存,因此如果响应头包含&#34; Cache-Control:private&#34;它将忽略存储。 (在你的情况下,我认为就是这种情况)。请参阅@ https://hc.apache.org/httpcomponents-client-ga/tutorial/html/caching.html(第6.4节配置)
尝试将其关闭,以便能够在仅客户端模式下使用,即
CacheConfig cacheConfig = new CacheConfig();
cacheConfig.setMaxCacheEntries(1000);
cacheConfig.setMaxObjectSizeBytes(1024 * 1024);
cacheConfig .setSharedCache(false); // Turn it OFF here
这对我有用。祝你好运!!!