0

私はApacheのHttpClientのCachingHttpClient実装を使用しています。次のシナリオを持っています:Apache HttpClientは条件付きリクエストでキャッシュされた本体を返します

私は、ヘッダーで応答を返したリソースを要求しました: キャッシュコントロール:max-age = 5。 したがって、CachingHttpClientは応答をキャッシュします。

私は以下を使用して同じリソースの条件付きリクエストを作成していますIf-Modified-Since。そして、私は状態コード304で応答を得ません。変更されていません(btwはサーバーをチェックしていません)。レスポンスボディなし。これはうまくいきますが、キャッシュされたボディにアクセスしたいのですが、それが更新されていなければそれを使いたいからです。

質問です:

は、最初の呼び出しからのキャッシュされた応答にアクセスするための便利な方法はありますか?

(org.apache.httpcomponentsを使用して:HTTPClientは、org.apache.httpcomponents:HTTPClientのキャッシュ;バージョン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クライアントのInit

@Bean 
    public HttpClient httpClient() { 
     return CachingHttpClients.createMemoryBound(); 
    } 

答えて

0

私はキャッシュを明示的に設定すると、そのキャッシュオブジェクトを直接使用することもできます。これは一般的なRTFMの問題です。

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