2015-06-23 4 views
2

У меня есть приложение springboot, которое позволяет кэшировать http. Я использую webRequest.checkModifiedSince, как описано в here. При запуске моего приложения в браузере я получаю правильный результат, 200 код состояния при первом попадании и 304 на следующий хит. Но когда я запускаю тест maven для своего приложения, кажется, что webRequest.checkModifiedSince всегда возвращает false.Тестирование Spring HTTP-кеширование

Вот мой TestCase:

@Test 
public void checkCache() throws Exception { 
    MvcResult res = this.mockMvc.perform(get("/resource/to/cache.jpg")) 
         .andExpect(status().isOk()) 
         .andReturn(); 

    String date = res.getResponse().getHeader("Last-Modified"); 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setIfModifiedSince(Long.parseLong(date)); 
    headers.setCacheControl("max-age=0"); 

    this.mockMvc.perform(get("same/resource/as/above.jpg") 
       .headers(headers)) 
       .andExpect(status().isNotModified()); 
} 

ли я что-то здесь не так?

ответ

1

При отправке условных запросов HTTP, вы должны, как правило, только отправить If-Modified-Since (используя значение Last-Modified) и If-None-Match (используя значение Etag).

В этом примере вы также отправляете директиву max-age=0, что означает «не давайте мне ничего, что старше 0 секунд», и в самом деле просит сервер отправить ответ в любом случае (см. RFC doc about max-age). Обычно это тип директивы, которую вы увидите в запросах браузера при выполнении «жесткого обновления».

Удалите эту директиву из запроса, и сервер должен ответить 304 Not Modified.

+0

спасибо @Brian! – afik

1

Заголовок Last-Modified представляет собой строку типа: Wed, 15 Nov 1995 04:58:08 GMT. Поэтому я очень сомневаюсь, что вы можете проанализировать их до Long.

Я думаю, что ваш тест терпит неудачу, поскольку исключение синтаксического анализа.

String dateString = res.getResponse().getHeader("Last-Modified"); 
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz"); 
Date date = format.parse(dateString); 

@see: How to parse Date from HTTP Last-Modified header?

+0

Спасибо @Ralph. Но когда я печатаю 'res.getResponse(). GetHeader (« Last-Modified »)' он дает мне «Long» (1434603287000). поэтому я использую Long.parse. Я не получил никакого исключения, но 'webRequest.checkModifiedSince' всегда возвращает false в mvn-тесте. У вас есть другое решение? – afik

Смежные вопросы