我正在使用来自Apache的HttpClient的CachingHttpClient实现。并有以下情况:
我请求了一个返回带标题的响应的资源: 的缓存控制:最大年龄= 5 即可。 所以CachingHttpClient缓存了响应。
我正在使用 If-Modified-Since 对相同资源进行条件请求。我收到状态代码为304的响应没有修改(顺便说一下,它甚至没有检查服务器)。没有回复机构。这很好,但我想访问缓存的主体,因为如果它没有更新我想使用它。
问题是:
是否有方便的方式从第一次通话中访问缓存的响应?
(使用org.apache.httpcomponents:httpclient,org.apache.httpcomponents:httpclient-cache;版本4.5.2)
服务器端:
@RequestMapping("/number")
public int getNumber(HttpServletResponse response, HttpServletRequest request) {
log.info("Number gen called");
response.setHeader("Cache-Control", "max-age=" + 5);
return random.nextInt();
}
客户方:
HttpGet httpget = new HttpGet("http://localhost:8080/number");
httpget.setHeader("If-Modified-Since", java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME.
format(ZonedDateTime.now(ZoneId.of("GMT")).minusSeconds(1)));
HttpResponse resp = httpClient.execute(httpget);
log.info("code: " + resp.getStatusLine().getStatusCode());
// here fails because no body on 2. call
String responseString = new BasicResponseHandler().handleResponse(resp);
Http Client Init
@Bean
public HttpClient httpClient() {
return CachingHttpClients.createMemoryBound();
}
答案 0 :(得分:0)
好的,如果我明确配置缓存,我也可以直接使用该缓存对象,所以这是典型的RTFM问题,我的不好。
@Bean
public HttpCacheStorage httpCacheStorage() {
CacheConfig cacheConfig = CacheConfig.custom()
.setMaxCacheEntries(1000)
.setMaxObjectSize(8192)
.build();
HttpCacheStorage cacheStorage = new BasicHttpCacheStorage(cacheConfig);
return cacheStorage;
}