NSURLConnection, NSURLRequest и удаленное кэширование - PullRequest
7 голосов
/ 22 марта 2009

У меня небольшая проблема с кэшированием запросов с использованием асинхронных соединений 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, он не добавляет, что строка и фактически удаленный кеш не используется.

Так что именно здесь происходит? Я что-то пропустил, или Какао устанавливает неправильный заголовок?

Ответы [ 3 ]

10 голосов
/ 18 декабря 2009

Из документации:

Указывает, что не только следует игнорировать данные локального кэша, но и прокси-серверам и другим промежуточным объектам следует указывать игнорировать их кэши, насколько позволяет протокол.

Из NSURLRequest.h (10,5 SDK)

Указывает, что не только следует игнорировать данные локального кэша, но и что прокси-серверам и другим промежуточным объектам следует указывать игнорировать их кэши, насколько позволяет протокол. Нереализованные.

Обратите внимание на разницу: Не реализовано

Время для сообщения об ошибке ...

2 голосов
/ 25 марта 2009

Добавляя параметр NSURLRequestReloadIgnoringLocalAndRemoteCacheData, вы указываете локальному кешу и любым прокси-серверам, которые могут обработать запрос между вашим клиентом и целевым сервером, чтобы они не возвращали свою собственную версию данных ответа. Я думаю, что ключевым компонентом здесь является то, что RemoteCache, вероятно, будет прокси-сервером, и вы просто указываете, что запрос должен всегда достигать реального сервера, а не прокси-копии.

Добавляя параметр «тупо длинное имя», вы выводите, что в вашем приложении уже есть предыдущая копия запроса, и поэтому вас интересует только фактическое получение данных с сервера, если они изменились, поэтому вы получаете ответ «304 Не изменен» с сервера.

Такое поведение кажется нелогичным, поскольку вы явно указываете клиенту не использовать свой собственный кеш, что подразумевает, что вы захотите сбросить что-то там и, конечно, не использовать его в качестве ссылки для любых последующих запросов. Я полагаю, что расширенные параметры кэша позволяют разработчику обрабатывать собственный уровень кэширования, т.е. получать уведомления, если данные не были обновлены на сервере, чтобы избежать ненужной повторной обработки.

1 голос
/ 25 марта 2009

Обратите внимание на "прокси и другие промежуточные звенья" часть. Вы избегаете только кэши, не находящиеся на исходном сервере. Исходный сервер все еще может вернуть 304.

...