Apache HttpClient在条件请求时返回缓存的主体

时间:2016-08-18 12:32:58

标签: caching apache-httpclient-4.x cache-control apache-commons-httpclient

我正在使用来自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();
    }

1 个答案:

答案 0 :(得分:0)

好的,如果我明确配置缓存,我也可以直接使用该缓存对象,所以这是典型的RTFM问题,我的不好。

@Bean
public HttpCacheStorage httpCacheStorage() {
    CacheConfig cacheConfig = CacheConfig.custom()
            .setMaxCacheEntries(1000)
            .setMaxObjectSize(8192)
            .build();
    HttpCacheStorage cacheStorage = new BasicHttpCacheStorage(cacheConfig);
    return cacheStorage;
}