У меня небольшая проблема с кэшированием запросов с использованием асинхронных соединений NSURLConnection на iPhone. Я не знаю, правильно ли я что-то понял или какао делает что-то противоположное тому, что должен был делать ...
Документация для NSURLRequest гласит:
NSURLRequestReloadIgnoringLocalCacheData
Указывает, что данные для загрузки URL-адреса должны быть загружены из исходного источника. Никакие существующие данные кэша не должны использоваться для удовлетворения запроса загрузки URL.
и
NSURLRequestReloadIgnoringLocalAndRemoteCacheData
Указывает, что не только следует игнорировать данные локального кэша, но и что прокси-серверы и другие промежуточные устройства должны быть проинструктированы игнорировать свои кэши, насколько позволяет протокол.
Теперь, если я отправлю NSURLRequest с NSURLRequestReloadIgnoringLocalCacheData (который должен игнорировать локальный кеш, но использовать удаленный кеш, если доступен), отправляемые заголовки:
GET /dashboard HTTP/1.1
User-Agent: XBlip1.0 CFNetwork/422.15.2 Darwin/9.6.0 (i386) (iMac8%2C1)
X-Blip-Api: 0.02
Accept: application/json
Authorization: Basic (...)
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: api.blip.pl
И статус 200 ОК. Но если я использую NSURLRequestReloadIgnoringLocalAndRemoteCacheData, которая должна игнорировать как локальный, так и удаленный кэши, как следует из названия, добавляется один дополнительный заголовок:
If-None-Match: "d751713988987e9331980363e24189ce"
И ответ: 304 Не изменено. Я проверил HTTP RFC, и для «If-None-Match» он говорит, что:
Если какой-либо из тегов объекта соответствует тегу объекта, который был бы возвращен в ответе на аналогичный запрос GET (без заголовка If-None-Match) для этого ресурса, (...), тогда сервер НЕ ДОЛЖЕН выполнять запрошенный метод (...) Вместо этого, если метод запроса был GET или HEAD, сервер ДОЛЖЕН ответить 304 (не измененным) ответом
Таким образом, кажется, что если я использую NSURLRequestReloadIgnoringLocalAndRemoteCacheData, вместо игнорирования удаленного кэша, Какао явно говорит удаленному серверу, что должен использовать удаленный кеш, и если я использую NSURLRequestReloadIgnoringLocalCacheData, он не добавляет, что строка и фактически удаленный кеш не используется.
Так что именно здесь происходит? Я что-то пропустил, или Какао устанавливает неправильный заголовок?