Вы все зависите от конфигурации сервера.
Если вы получаете заголовок ответа Expires
, это просто означает, что вам не нужно ничего запрашивать до истечения указанного времени.Если вы получаете заголовок ответа Last-Modified
, это означает, что вы должны иметь возможность использовать If-Modified-Since
для его проверки.Если вы получаете заголовок ответа ETag
, это означает, что вы должны иметь возможность использовать If-None-Match
для его проверки.
Давайте возьмем http://cdn3.sstatic.net/stackoverflow/img/favicon.ico в качестве примера (изображение значка Stackoverflow):
URLConnection connection = new URL("http://cdn3.sstatic.net/stackoverflow/img/favicon.ico").openConnection();
System.out.println(connection.getHeaderFields());
Это дает:
{null = [HTTP/1.1 200 OK], ETag = ["9d9bd8b1165cb1: 0"], дата = [ср., 17 августа 2011 г. 17:57:07 GMT], длина контента = [1150], последняя модификация = [ср, 06 окт. 201002:53:46 GMT], Content-Type = [image / x-icon], Connection = [keep-alive], Accept-Ranges = [байты], Сервер = [nginx / 0.8.36], X-Cache =[HIT], Cache-Control = [max-age = 604800]}
Теперь выполните If-Modified-Since
с тем же значением, что и Last-Modified
:
URLConnection connection = new URL("http://cdn3.sstatic.net/stackoverflow/img/favicon.ico").openConnection();
connection.setRequestProperty("If-Modified-Since", "Wed, 06 Oct 2010 02:53:46 GMT");
System.out.println(connection.getHeaderFields());
Это дает ожидаемое значение 304:
{null = [HTTP / 1.1 304 Not Modified], ETag = ["9d9bd8b1165cb1: 0"],Дата = [ср, 17 авг. 2011 17:57:42 GMT], последняя модификация = [ср, 06 окт. 2010 02:53:46 GMT], соединение = [keep-alive], сервер = [nginx / 0.8.36], X-Cache = [HIT], Cache-Control = [max-age = 604800]}
Теперь выполните If-None-Match
с тем же значением, что и ETag
:
URLConnection connection = new URL("http://cdn3.sstatic.net/stackoverflow/img/favicon.ico").openConnection();
connection.setRequestProperty("If-None-Match", "9d9bd8b1165cb1:0");
System.out.println(connection.getHeaderFields());
Это дает неожиданно a 200:
{null = [HTTP / 1.1 200 OK], ETag = ["9d9bd8b1165cb1: 0"], дата = [ср, 17 августа 2011 18:01:42 GMT], длина содержимого = [1150], последняя модификация = [среда, 06 октября 2010 г. 02:53:46 GMT], Content-Type = [image / x-icon], Connection = [keep-alive], Accept-Ranges = [байты], сервер= [nginx / 0.8.36], X-Cache = [HIT], Cache-Control = [max-age = 604800]}
Еще более удивительно, когда оба заголовка установлены случайным образомзначение мусора как ETag
, сервер по-прежнему выдает 304. Это признак того, что If-None-Match
полностью игнорируется сервером, стоящим за http://cdn3.sstatic.net. Это может быть (прокси) проблема конфигурации или может быть сделано полностью осознанно(не по понятным причинам imho).